【发布时间】:2014-01-10 13:25:31
【问题描述】:
虽然我认为我理解 C++ 中的 rvalue 和 lvalue 语义,但我似乎一遍又一遍地踩着奇怪的例子证明我不知道深蹲。
但是有两个非常简单和基本的,我不明白它们是如何工作的。在我编译它们之前,我认为没有一个可以,在我看到(1) 有效之后,我认为(2) 也可以。但是,(1) 有效,(2) 无效:
(1) const std::string &s = "asd";
这里发生了什么?我的猜测是一个临时的const string 对象是从"asd" 构造的,然后s 绑定到那个临时对象。但是在这一行之后临时对象不会被销毁,所以我们会留下一个无效的引用吗?
当我删除 const 限定符时:
(2) std::string &s = "asd";
我收到编译器错误(VS 2013):cannot convert from 'const char [4]' to 'std::string &'。这似乎反驳了我的理论,因为根据它(我的猜测),一个临时的string 对象将从"asd" 构造,然后分配给它s,这不会产生任何编译错误。
总结一下:
-
s绑定到什么? -
s绑定的对象的生命周期是多少? - 是什么让
(1)编译而(2)不编译(是std::string中定义的一些转换运算符还是C++ 语义)?
【问题讨论】:
-
这是一个
const参考。这是一个巨大的差异,因为您将 (1) 设为右值。函数f1(const string &s)和f2(string &s)也是如此,在第一种情况下您可以调用f2("my text const"),但另一种情况会失败。