临时对象和非const引用

时间:2014-02-05 14:41:39

标签: c++ c++11

我无法弄清楚为什么在使用以下代码时出现编译错误。

一个简单的结构及其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引用。但在这种情况下,它是一个内联函数,所以不应该有任何临时对象。我错过了什么吗?

感谢。劳伦

2 个答案:

答案 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引用传递。