c++ - 通过引用传递创建的对象 'on the fly'

标签 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++。

最佳答案

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

只是不要。要么将参数设为 const 引用:

void DoSomethingToMyClass(const MyClass& my_class_reference);

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

MyClass x;
DoSomethingToMyClass(x);

关于c++ - 通过引用传递创建的对象 'on the fly',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14375640/

相关文章:

c++ - Google Mock 未报告低于预期的通话

C++ 为什么 ofstream 指向的文件未填充?

c++ - 在没有 'extern' 的情况下访问别处定义的变量值的最佳方法?

java - 下面代码中的 super 指向什么?

c++ - 我可以修改作为参数传递的指针的目标吗?

c++ - std::function 函数与函数指针

c++ - 如何在 C++ 中捕获 'any' 异常?

c++ - 为什么我可以使用类型别名声明一个 const 引用?

c++ - 如何声明一个创建永远不会为空的对象的函数?

c++ - 引用是否有存储位置?