这是一个非常小的例子:
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)
我找到了三种解决方法:
- 为 ProcessFoo 的调用创建一个临时变量。
像这样:
Foo foo42(42);
ProcessFoo(foo42);
ProcessFoo 接受一个常量引用:
void ProcessFoo(const Foo& foo)
ProcessFoo 只是让 Foo 按值传递。
void ProcessFoo(Foo foo)
为什么编译器禁止我的原始代码? (它在防范什么)?满足编译器的上述三种解决方法中的每一种是什么? MSVC 会允许什么,但 g++ 不允许?
原文由 selbie 发布,翻译遵循 CC BY-SA 4.0 许可协议
按照设计,C++ 只允许将临时值传递给 const 引用、值或右值引用。这个想法是,一个采用非常量引用参数的函数声明它想要修改参数并允许它返回给调用者。临时这样做是没有意义的,而且很可能是一个错误。
而且我不知道您正在运行哪个版本的 g++。它在这里不起作用:http: //coliru.stacked-crooked.com/a/43096cb398cbc973