2014-02-05 2 views
0

다음 코드를 사용할 때 왜 컴파일 오류가 계속 발생하는지 알 수 없습니다.임시 개체 및 비 const 참조

간단한 구조와 초기화 도우미 기능 :

typedef struct _ccColor4F 
{ 
    GLfloat r; 
    GLfloat g; 
    GLfloat b; 
    GLfloat a; 
} ccColor4F; 

static inline ccColor4F ccc4f(const GLfloat r, const GLfloat g, const GLfloat b, const GLfloat a) 
{ 
    ccColor4F c4 = {r, g, b, a}; 
    return c4; 
} 

및 구조 사용 방법 : 내가 컴파일 오류가 다음과 같은 init 함수를 사용하려고하면 지금

void TexturePolygon::setColor(ccColor4F &color); 

을 .

poly->setColor(ccc4f(1.f, 1.f, 1.f, 1.f)); 

const가 아닌 lvalue를 참조 'ccColor4F'을 입력 할 수 (일명 '적인 Cocos2D :: _ ccColor4F')이 유형의 임시에 바인딩 할 수 없습니다 'ccColor4F'나는 매개 변수를 변경해야

오류를 피하기 위해 setColor를 "const 참조"로 변경하십시오. 임시 객체는 const 참조에 바인딩되어야한다는 것을 이해합니다. 하지만이 경우에는 인라인 함수이므로 임시 객체가 있어서는 안됩니다. 내가 놓친 게 있니?

감사합니다. 로랑은

+2

왜 '인라인'이 여기에 어떤 차이가 있을지 모르겠습니다. –

+2

''inline'은 여러 번역 단위로 함수를 정의 할 수있게 해줍니다 (많은 컴파일러에서 호출을 인라인해야합니다). 호출이 인라인되거나 강제적 인 의미를 변경하지 않습니다. 참조 인수는 최적화 된 경우에도 여전히 참조로 간주됩니다. –

+0

@FredLarson 필자는'inline'이 호출의 의미를 변경했을 것이라고 생각했습니다. –

답변

3

기능이 inline 인 것은 날씨에 영향을 미치지 않거나 물체가 일시적이지 않습니다.

inline 당신이 생각하는대로하지 않습니다. 그것은 많은 사람들이 생각하는 것을하지 않습니다.

무엇이 inline은 여러 번역 단위로 기능을 정의 할 수 있도록합니다. 어떤 inline않습니다 않는 코드를 인라인 확장합니다 (힌트, 요구 사항이 아닙니다. 컴파일러 수 및 당신을 무시합니다.), 호출의 의미에 영향을 미치지 않습니다 매개 변수 또는 보고. 코드에서

:

poly->setColor(ccc4f(1.f, 1.f, 1.f, 1.f)); 

ccc4f(1.f, 1.f, 1.f, 1.f)에 의해 구축 목적은 임시이다. setColor()inline이라는 사실은 아무런 차이가 없습니다.당신이 setColor()에 비 일시적를 전송해야하는 경우

, 당신은 ccc4f 비 일시적 구축해야 :

ccc4f myObj(1.f, 1.f, 1.f, 1.f); 
poly->setColor (myObj); 

당신은 할 수 범위를이 myObj 당신이 setColor를 호출 직후 파괴되도록 :

{ 
    ccc4f myObj(1.f, 1.f, 1.f, 1.f); 
    poly->setColor (myObj); 
} 

그러나 myObj이 RAII 객체로 나타나지 않는 것을 오히려 무의미한 것 같다. 왜 setColorconst 참조를 수락하고 그걸로 끝내지 않는 것이 좋을까요?

+0

확인. 이제 이해가된다. 나는 inline이 호출의 의미를 바꿀 수도 있다고 생각했다. 추신 : const 참조로 변경하겠습니다. 그것은 내가 왜이 경우에해야만하는지 이해하지 못했습니다. 감사! –

2

귀하의 setColor 함수는

color = NULL; 

희망하는 경우를 할 수 있어야 의미 할당 가능한 메모리 참조를 얻을 것으로 기대하고있다. 임시 객체를 제공하기 때문에 코드에서이를 허용하지 않습니다.

여기에 어떤 이유가 있습니까? setColor 함수가 color 매개 변수를 변경합니다.이 경우 임시 개체를 지정하는 것이 의미가 없습니다. 또는 setColor 함수가 color 매개 변수를 변경하지 않는 경우 const 참조로 전달해야합니다.

관련 문제