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)
无论我到哪里谷歌这个结果,我只看到以下答案
有人说,临时对象在声明后消失了.所以你不应该修改它.
如果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改变?
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&对该对象(例如函数返回)使用 a,而不是将其复制到另一个变量中以供以后使用。对临时对象进行常量引用会将该临时对象的生命周期延长至引用的生命周期,从而允许您访问任何可读状态。
写入是不允许的,因为一旦你想改变一个变量,你也可以拥有一个真实的实例而不是一个临时的,它只是一个非常量引用的别名。
| 归档时间: |
|
| 查看次数: |
14260 次 |
| 最近记录: |