2

如果这个问题已经得到回答,我深表歉意——我已经搜索过了,但由于通过引用传递的更一般的问题数量众多,因此很难找到这个搜索词。

我遇到的问题是,当我编译这种东西时,我收到了 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++。

4

2 回答 2

8

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

只是不要。要么有参数const引用:

void DoSomethingToMyClass(const MyClass& my_class_reference);

这可能不适用于这里,因为顾名思义,该方法会改变类,或预先创建对象:

MyClass x;
DoSomethingToMyClass(x);
于 2013-01-17T09:19:18.157 回答
3

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

所以要么:
您需要更改您的界面以获取 const 引用以绑定到临时。

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

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

void DoSomethingToMyClass(MyClass& my_class_reference);

Myclass obj;
DoSomethingToMyClass(obj);
于 2013-01-17T09:18:56.257 回答