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

可能重复:
const引用是否延长了临时的生命?
延长临时工的寿命

C ++允许将临时对象仅分配给const引用。 它不会允许指定临时对象的分配。

例如:

String& a = String("test"); // Error const String& a = String("test"); // Ok 

到处都是谷歌这个结果,我只看到下面的答案

  1. 修改临时对象会导致无法识别的问题
  2. 修改临时对象是危险的
  3. 在某个时候,你会忘记它是一个临时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时,它是完整的。 只有整条线路完成后才会销毁。