非const左值引用

Mar*_*ars 42 c++

你为什么要这样做

int a;
const double &m = a;
Run Code Online (Sandbox Code Playgroud)

但是当你这样做的时候

int a;
double &m = a;
Run Code Online (Sandbox Code Playgroud)

你收到错误?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'
Run Code Online (Sandbox Code Playgroud)

编辑:

更具体地说,我试图理解非const引用不能绑定临时对象的原因.

Mah*_*esh 34

那是因为临时不能绑定到非const引用.

double &m = a;
Run Code Online (Sandbox Code Playgroud)

a是类型int,正在转换为double.所以创建了一个临时的.用户定义类型的情况也是如此.

Foo &obj = Foo(); // You will see the same error message.
Run Code Online (Sandbox Code Playgroud)

但在Visual Studio中,由于默认情况下启用了编译器扩展,因此工作正常.但海湾合作委员会会抱怨.

  • 我投反对票,因为你缺少解决方案。只要多写一句话,所有问题就迎刃而解了。你会在“Foo &obj = Foo();”中做什么 案件 ? (20认同)
  • @AbbasPerçin 的问题是为什么而不是如何,所以我认为这个答案没有任何问题。 (5认同)
  • @AbbasPerçin 解决方案已经在问题中给出:只需将其设为常量: const Foo &obj = Foo(); (2认同)

小智 18

因为对临时修改是没有意义的,所以c ++不希望你将非const引用绑定到临时.例如.

int a;
double &m = a;  // caution:this does not work.
Run Code Online (Sandbox Code Playgroud)

如果有效怎么办? a是int类型,正在转换为double.所以创建了一个临时的.

你可以修改m,绑定到一个临时的,但几乎没有任何反应.修改后,变量a不会改变(更糟糕的是,你可能认为a已经改变,这可能会导致问题).

  • 但是如果临时文件包含指向其他资源的指针呢?那么对一个临时的进行修改并不是没有意义的。 (2认同)