通过引用传递“即时”创建的对象

时间:2013-01-17 09:17:19

标签: c++ reference

如果这个问题已经得到回答,我很抱歉 - 我已经搜索过了,但是由于通过引用传递的一般性问题的绝对数量,这是一个难以找到的搜索词。

我遇到的问题是,当我编译这类东西时,我收到了4级警告:

class MyClass
{
public:
    MyClass() {};
};

void DoSomethingToMyClass(MyClass& my_class_reference);


void MyRoutine()
{
    DoSomethingToMyClass(MyClass());
};

警告(C4239)基本上表示从实例到引用有一个狡猾的演员表。我从仔细检查中学到了不要注销4级警告,因为他们中的许多人已经识别出我(和其他人)代码中的错误,例如返回-1作为size_t(知道什么size_t(-1)的奖励积分)实际上是)。

有人可以向我解释上面的代码实际上会做什么吗?我最偏执的理论是:

  • MyClass()的实例是即时创建的,但没有给出正确的句柄。
  • 对my_class_reference引用执行的操作会失误。

另一个极端是C4239总是可以被忽略......

* [类似的情况是有人默认参考:

void DoSomethingToMyClass(MyClass& my_class_reference=MyClass());

这会生成相同的警告,但在另一个主题中部分涵盖。] *

修改

感谢您的快速反应,伙计们。对不起:应该在Visual Studio中提到它是VC ++。

2 个答案:

答案 0 :(得分:8)

您收到警告,因为这不是标准的C ++,而是一个MS扩展,允许您将临时值绑定到非const引用。

请不要。要么参数为const参考:

void DoSomethingToMyClass(const MyClass& my_class_reference);

这里可能不适用,因为名称暗示该方法会改变类,或者事先创建对象:

MyClass x;
DoSomethingToMyClass(x);

答案 1 :(得分:3)

您正在通过MyClass()创建临时无名对象,并且根据C ++标准,临时对象无法绑定到非常量引用。因此警告。
有些编译器允许将其作为语言扩展。

所以要么:
您需要更改接口以将const引用绑定到临时。

void DoSomethingToMyClass(const MyClass& my_class_reference)
                          ^^^^^^^

或者不传递临时无名对象传递命名对象。

void DoSomethingToMyClass(MyClass& my_class_reference);

Myclass obj;
DoSomethingToMyClass(obj);