如果这个问题已经得到回答,我很抱歉 - 我已经搜索过了,但是由于通过引用传递的一般性问题的绝对数量,这是一个难以找到的搜索词。
我遇到的问题是,当我编译这类东西时,我收到了4级警告:
class MyClass
{
public:
MyClass() {};
};
void DoSomethingToMyClass(MyClass& my_class_reference);
void MyRoutine()
{
DoSomethingToMyClass(MyClass());
};
警告(C4239)基本上表示从实例到引用有一个狡猾的演员表。我从仔细检查中学到了不要注销4级警告,因为他们中的许多人已经识别出我(和其他人)代码中的错误,例如返回-1作为size_t(知道什么size_t(-1)的奖励积分)实际上是)。
有人可以向我解释上面的代码实际上会做什么吗?我最偏执的理论是:
另一个极端是C4239总是可以被忽略......
* [类似的情况是有人默认参考:
void DoSomethingToMyClass(MyClass& my_class_reference=MyClass());
这会生成相同的警告,但在另一个主题中部分涵盖。] *
修改
感谢您的快速反应,伙计们。对不起:应该在Visual Studio中提到它是VC ++。
答案 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);