我无法弄清楚为什么在使用以下代码时出现编译错误。
一个简单的结构及其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));
对类型'ccColor4F'(又名'cocos2d :: _ ccColor4F')的非常量左值引用无法绑定到'ccColor4F'类型的临时值
我必须将setColor的参数更改为“const reference”以避免错误。我知道临时对象必须绑定到const引用。但在这种情况下,它是一个内联函数,所以不应该有任何临时对象。我错过了什么吗?
感谢。劳伦
答案 0 :(得分: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对象。为什么不让setColor
接受const
引用并完成它?
答案 1 :(得分:2)
你的setColor
函数希望得到一个可指定的内存引用,这意味着它应该能够做到
color = NULL;
如果它如此渴望。您的代码不允许这样做,因为您提供了一个临时对象。
这是什么原因? setColor
函数更改color
参数,在这种情况下,给它一个临时对象是没有意义的;或setColor
函数不会更改color
参数,在这种情况下,它应作为const引用传递。