为什么非const引用临时对象?

use*_*471 45 c++ temporary-objects

C++只允许将临时对象分配给const引用.它不允许分配临时对象来引用.

例如:

String& a = String("test");         // Error
const String& a = String("test");   // Ok
Run Code Online (Sandbox Code Playgroud)

无论我到哪里谷歌这个结果,我只看到以下答案

  1. 修改临时对象会导致无法识别的问题
  2. 修改临时对象很危险
  3. 在某些时候,你会忘记它是一个临时变量

有人说,临时对象在声明后消失了.所以你不应该修改它.

如果C++,如此热衷于阻止修改临时对象,它应该阻止读取临时对象吗?如果临时对象消失了,那么从那里读取内容是没有意义的吗?权利可能发生的可能情况也可能涉及阅读.

那为什么它一直阻止写入并允许读取?

请给我一个可靠的c ++代码说明.

请不要通过指出一些替代方案来偏离问题.请给我一个可靠的答案代码,为什么const int&被允许,而int&不允许用于临时对象.

一个说&&在那里..我的问题不同..另一个说,改变不会反映..改变也不会反映即使它也是const int&.例如:双倍; Const int&i = a; 一个++; 不会影响我..

Bo *_*son 30

不允许引用临时值的原始案例是函数参数.假设这是允许的:

void inc(double& x)
{ x += 0.1; }

int i = 0;
inc(i);
Run Code Online (Sandbox Code Playgroud)

为什么不i改变?

  • 它现在失败了,如果允许绑定到临时,它不会失败.在传递给函数之前,int被转换为temp double. (9认同)
  • 这个例子表明允许隐式转换不是一个好主意。 (3认同)
  • 这不能只是在编译时出错吗?(不是吗?)我不确定问题出在哪里...... (2认同)
  • 嗯,有趣......但他们不能说"如果值已经是l值引用,那么不允许隐式转换到另一个l值引用类型"?或者也许这会打败这一点......不确定,还在考虑它...... +1 (2认同)
  • @Andrew 这如何澄清任何事情?`i` 不能递增,因为该函数不接受 `int &`,只接受 `double &`。所以,从`i` 得到一个转换构造的临时`double`,这就是改变的地方。变化的幅度完全无关紧要:在进行调用时,“i”已经不在画面中了。我真的很高兴 C++ 不允许这样做,因为否则我们会遇到所有问题:“但我增加了一个整数,所以它应该可以工作,对吧?” 这听起来像你说的。但我可能会遗漏一些东西。 (2认同)

bam*_*s53 14

如果C++,如此热衷于阻止修改临时对象,它应该阻止读取临时对象吗?如果临时对象消失了,那么从那里读取内容是没有意义的吗?

不,阅读这个对象是非常明智的.仅仅因为它将来会消失并不意味着现在读取数据毫无意义.

open_file(std::string("foo.txt"));
Run Code Online (Sandbox Code Playgroud)

std::string("foo.txt")是一个临时的,它将在调用之后停止存在,open_file()但它包含的数据确实存在非常重要.

不允许临时对象绑定到非const引用的理性实际上并不是写入临时对象的一些基本问题.事实上,在许多地方,C++非常乐意允许修改临时对象:

std::string("foo") = "bar";
Run Code Online (Sandbox Code Playgroud)

只是设计师认为它会导致足够数量的问题(可能是由于'out参数'的常见习惯用法)而没有启用任何类似值的东西,所以他们只是做出了一个设计决定来禁止临时绑定到非const引用.

现在,通过右值引用,您可以完全执行以前禁止的操作:

void foo(int &&output) {
    output = 1;
}

foo(2);
Run Code Online (Sandbox Code Playgroud)

这很好用,它不是很有用.

  • "不允许临时演员绑定到非const引用的理性实际上并不是写给临时演员的一些基本问题" - 谢谢你提到这一点. (6认同)

Mar*_*k B 6

如果您有一个复制成本非常高的临时对象,您可能更愿意const&对该对象(例如函数返回)使用 a,而不是将其复制到另一个变量中以供以后使用。对临时对象进行常量引用会将该临时对象的生命周期延长至引用的生命周期,从而允许您访问任何可读状态。

写入是不允许的,因为一旦你想改变一个变量,你也可以拥有一个真实的实例而不是一个临时的,它只是一个非常量引用的别名。


归档时间:

查看次数:

14260 次

最近记录:

6 年,1 月 前