无法将临时对象作为参考传递

新手上路,请多包涵

这是一个非常小的例子:

 class Foo
{
public:
    Foo(int x) {};
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
    ProcessFoo(Foo(42));
    return 0;
}

以上在 Visual Studio 上编译良好,但在 Linux 和 Mac 上会产生错误。

编译上述生成:

 $ g++ -std=c++11 -c newfile.cpp

newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
     ProcessFoo(Foo(42));
                       ^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
 void ProcessFoo(Foo& foo)

我找到了三种解决方法:

  1. 为 ProcessFoo 的调用创建一个临时变量。

像这样:

 Foo foo42(42);
ProcessFoo(foo42);

  1. ProcessFoo 接受一个常量引用: void ProcessFoo(const Foo& foo)

  2. ProcessFoo 只是让 Foo 按值传递。 void ProcessFoo(Foo foo)

为什么编译器禁止我的原始代码? (它在防范什么)?满足编译器的上述三种解决方法中的每一种是什么? MSVC 会允许什么,但 g++ 不允许?

原文由 selbie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 205
1 个回答

按照设计,C++ 只允许将临时值传递给 const 引用、值或右值引用。这个想法是,一个采用非常量引用参数的函数声明它想要修改参数并允许它返回给调用者。临时这样做是没有意义的,而且很可能是一个错误。

而且我不知道您正在运行哪个版本的 g++。它在这里不起作用:http: //coliru.stacked-crooked.com/a/43096cb398cbc973

原文由 Jay Miller 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题