如果这个问题已经被回答的话,我很抱歉--我已经搜索过了,但是这是一个很难找到的搜索词,因为通过引用传递更多的一般性问题。
我遇到的问题是,当我编译这类东西时,会收到第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中提到它是VC++。
发布于 2013-01-17 09:19:18
您会得到警告,因为这不是标准的C++,而是允许您将临时人员绑定到非const引用的MS扩展。
不要。要么有一个const引用的参数:
void DoSomethingToMyClass(const MyClass& my_class_reference);这在这里可能不适用,顾名思义,方法会改变类,或者预先创建对象:
MyClass x;
DoSomethingToMyClass(x);发布于 2013-01-17 09:18:56
您正在通过MyClass()创建一个临时无名对象,并且按照C++标准,临时对象不能绑定到非常量引用。因此发出了警告。
有些编译器确实允许将其作为语言扩展。
因此,要么是:
您需要更改您的接口以接受const引用来绑定到一个临时的。
void DoSomethingToMyClass(const MyClass& my_class_reference)
^^^^^^^或者,不要传递临时无名对象,传递命名对象。
void DoSomethingToMyClass(MyClass& my_class_reference);
Myclass obj;
DoSomethingToMyClass(obj);https://stackoverflow.com/questions/14375640
复制相似问题