gpt4 book ai didi

c++ - 无法将临时对象作为引用传递

转载 作者:IT老高 更新时间:2023-10-28 22:11:13 25 4
gpt4 key购买 nike

这是一个非常简单的例子:

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 采用 const 引用:void ProcessFoo(const Foo& foo)

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

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

最佳答案

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

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

关于c++ - 无法将临时对象作为引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com