2014-02-05 57 views
0

我想不通使用下面的代码的时候,为什么我总是收到编译错误。临时对象和非const引用

简单的结构和它的init助手功能:

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; 
} 

,并使用该结构的方法:

void TexturePolygon::setColor(ccColor4F &color); 

现在,如果我尝试使用init功能如下我得到一个编译错误。

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

非const左值参考输入 'ccColor4F'(又名 '的cocos2d :: _ ccColor4F')不能结合到临时类型的 'ccColor4F'

我必须改变参数将setColor设置为“常量引用”以避免错误。我明白一个临时对象必须绑定到一个const引用。但在这种情况下,它是一个内联函数,所以不应该有任何临时对象。我错过了什么吗?

谢谢。洛朗

+2

我不确定你为什么认为'inline'会在这里有所作为。 –

+2

'inline'允许您在多个翻译单元中定义该功能(对于许多编译器来说,这对于内联调用是必要的)。它不强制调用内联,或者改变它的任何语义。即使优化了参考参数,仍然将其视为参考。 –

+0

@FredLarson我以为'inline'会改变调用的语义。 –

回答

3

功能是inline对天气无轴承与否的对象是临时的。

inline没有做什么,你认为它。它甚至不做许多人认为它所做的事情。

inline所做的就是让功能可以在多个翻译单元中定义。什么inline不是 do是使内联代码扩展(这是一个提示,而不是一个要求,编译器可以并且会忽略你),它不会影响调用的语义,参数或回报。

在您的代码:

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对象。为什么不只有setColor接受const参考并完成它?

+0

好的。我现在明白了。我错了,认为内联可能会改变调用的语义。 PS:我将改为const引用。这只是我不明白为什么我不得不在这种情况下。谢谢! –

2

setColor函数期望获得一个分配的内存引用,这意味着它应该能够做到

color = NULL; 

如果愿意。你的代码不允许这样做,因为你正在给一个临时对象。

有什么理由吗?无论是setColor功能改变color参数,在这种情况下,它没有任何意义给它一个临时对象;或setColor功能不改变color参数,在这种情况下,它应当作为一个const-引用传递。

相关问题