为什么不是非const引用临时对象?
可能重复:
const引用是否延长了临时的生命?
延长临时工的寿命
C ++允许将临时对象仅分配给const引用。 它不会允许指定临时对象的分配。
例如:
String& a = String("test"); // Error const String& a = String("test"); // Ok
到处都是谷歌这个结果,我只看到下面的答案
- 修改临时对象会导致无法识别的问题
- 修改临时对象是危险的
- 在某个时候,你会忘记它是一个临时variables
据说,声明之后,临时物体消失了。 所以你不应该修改它。
如果C ++非常热衷于阻止修改临时对象,它应该阻止读取临时对象吗? 如果临时对象消失了,那么从这里读内容是没有意义的呢? 可能的情况下,权利可能发生,也可能涉及阅读。
那么为什么它一直在阻止写,允许读?
请给我一个坚实的C ++代码解释。
请不要通过指出一些替代scheme来改变这个问题。 请给我坚实的答案,代码为什么const int&是允许的,int&不允许用于临时对象。
一个说&&是在那里..我的问题不同..另一个说,改变不会反映..改变也不会反映,即使它是const int&too。 例如:double a; const int&i = a; 一个++; 不会影响我..
不允许引用临时对象的原始情况是函数参数。 假设这是允许的:
void inc(double& x) { x += 0.1; } int i = 0; inc(i);
为什么我不改变?
如果C ++非常热衷于阻止修改临时对象,它应该阻止读取临时对象吗? 如果临时对象消失了,那么从这里读内容是没有意义的呢?
不,阅读对象是非常明智的。 仅仅因为将来消失并不意味着现在读取数据是没有意义的。
open_file(std::string("foo.txt"));
std::string("foo.txt")
是一个临时的,它会在open_file()
调用后停止存在,但它包含的数据非常重要。
不允许临时绑定到非const引用的合理性实际上并不是写入临时对象的一些基本问题。 事实上,在很多地方,C ++都非常乐意允许临时对象进行修改:
std::string("foo") = "bar";
只是devise师觉得它会导致足够数量的问题(可能是由于“out参数”的常见习惯用法)而没有启用任何类似的值,所以他们只是做出了一个devise决定,禁止临时绑定到非const引用。
现在你可以使用右值来完成以前禁止的操作:
void foo(int &&output) { output = 1; } foo(2);
这工作正常,这只是不是很有用。
如果你有一个复制的代价很高的临时对象,那么你可能更喜欢使用一个const&
对象(比如函数返回值),而不是把它复制到另一个variables中以便以后使用。 只要引用存在,就可以持续地引用临时文件来延长临时文件的生命,从而允许您访问任何可读状态。
写作是不允许的,因为一旦你想变异variables你可能有一个真实的实例,而不是一个临时的,只是作为非const引用的别名。
这是有逻辑的原因。 想想,这一行你想要的是什么:
String& a = String("test"); // Error
你想要一个参考。 一个引用涉及到它引用的对象。 就像对象的地址一样(虽然引用不是地址,但是它使得解释更加清晰)。 你实际上试图得到像String("test")
的地址。 但是这个对象在下一行将会消失,那么它的地址是什么,如果它指向的对象不存在? 现在指向一些毫无意义的东西…
关于你的第二个问题,完全允许临时对象有什么意义呢,那么没有什么不对的。 例如,考虑一下你想要传递一个String
对象给一个函数的情况,该函数返回对应于该String的一个修改过的string。 让我们调用DoubleString函数,而不是这样做
String s("hello "); String s2 = DoubleString(s);
您可以使用更短,更方便的forms
String s2 = DoubleString(String("hello "));
看到,临时对象String("hello ")
在整行代码中存在,这意味着当它被发送到DoubleString
时,它是完整的。 只有整条线路完成后才会销毁。