在 C 中将临时对象作为引用传递
在 C 中,如下所示的最小代码片段可能会导致 Linux 和 Mac 上的编译错误平台:
class Foo { public: Foo(int x) {} }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
编译错误:
编译上述代码会导致以下错误:
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)
发生错误的原因:
按设计, C 禁止将临时对象传递给非常量引用参数。此限制旨在防止潜在的误解和错误。当函数声明非常量引用参数时,它表示其意图修改该对象并将其返回给调用者。将临时参数传递给此类参数是不合逻辑的,因为一旦函数返回,它将被销毁。
解决方法:
要解决此编译错误,请考虑以下解决方法:
Foo foo42(42); ProcessFoo(foo42);
void ProcessFoo(const Foo& foo)
void ProcessFoo(Foo foo)
为什么 MSVC 允许它:
不清楚为什么 Microsoft Visual Studio (MSVC) 允许编译此代码,而 g 则不允许。在这方面,MSVC 对 C 标准可能有不同的解释。通常建议遵循标准以确保不同编译器之间的行为一致。
以上是为什么在 C 中将临时对象传递给非常量引用失败?的详细内容。更多信息请关注PHP中文网其他相关文章!