C ++只允许将临时对象分配给const引用。它不允许分配临时对象来引用。
例如:
String& a = String("test"); // Error
const String& a = String("test"); // Ok
无论我到哪里谷歌这个结果,我只看到以下答案
有人说,临时对象在声明后消失了。所以你不应该修改它。
如果C ++,如此热衷于阻止修改临时对象,它应该阻止读取临时对象吗?如果临时对象消失了,那么从那里读取内容是没有意义的吗?权利可能发生的可能情况也可能涉及阅读。
那为什么它一直阻止写入并允许读取?
请给我一个可靠的c ++代码说明。
请不要通过指出一些替代方案来偏离问题。请给我一个可靠的答案代码,为什么const int&被允许,int&不允许用于临时对象。
一个说&&在那里..我的问题不同..另一个说,改变不会反映..改变也不会反映即使它也是const int&。例如:双倍; Const int&i = a;一个++;不会影响我..
不允许引用临时值的原始案例是函数参数。假设这是允许的:
void inc(double& x)
{ x += 0.1; }
int i = 0;
inc(i);
为什么不改变i
?
如果C ++,如此热衷于阻止修改临时对象,它应该阻止读取临时对象吗?如果临时对象消失了,那么从那里读取内容是没有意义的吗?
不,阅读这个对象是非常明智的。仅仅因为它将来会消失并不意味着现在读取数据毫无意义。
open_file(std::string("foo.txt"));
std::string("foo.txt")
是一个临时的,它会在调用open_file()
之后停止存在,但它确实存在的数据非常重要。
不允许临时对象绑定到非const引用的理性实际上并不是写入临时对象的一些基本问题。事实上,在许多地方,C ++非常乐意允许修改临时对象:
std::string("foo") = "bar";
只是设计师觉得它会导致足够数量的问题(可能是由于'out参数'的常见习惯用法)而没有启用任何类似值的东西,所以他们只是做出了一个设计决定来禁止临时绑定到非const引用。
现在,通过右值引用,您可以完全执行以前禁止的操作:
void foo(int &&output) {
output = 1;
}
foo(2);
这很好用,它不是很有用。
如果你有一个复制非常昂贵的临时对象,你可能更喜欢将const&
带到该对象(比如函数返回),而不是将其复制到另一个变量中以便以后使用。只要引用存在,对临时的持续引用会延长该临时的生命,允许您访问任何可读状态。
写入是不允许的,因为只要你想改变一个变量,你也可以拥有一个真实的实例而不是一个仅作为非const引用别名的临时实例。
这是有道理的。想想,这行中你真正想要的是什么:
String& a = String("test"); // Error
你想要一个参考。引用涉及它引用的对象。就像对象的地址一样(虽然引用不是地址,但这样解释更清晰)。你实际上试图获得类似String("test")
地址的东西。但是这个对象会在下一行消失,所以如果它指向的对象不存在,它的地址是什么呢? a
现在指向一些毫无意义的东西......
关于你的第二个问题,完全允许临时对象有什么意义,好吧,这没有什么不妥。例如,考虑将String
对象传递给函数的情况,该函数返回一个与该String对应的修改后的字符串。让我们调用函数DoubleString,而不是做
String s("hello ");
String s2 = DoubleString(s);
您可以使用更简单,更方便的表格
String s2 = DoubleString(String("hello "));
请注意,临时对象String("hello ")
在整行代码中存活,这意味着它在发送到DoubleString
之后及其之后是完整的。只有在整条生产线完成后才会销毁它。