0
const string &str1="test";

string &str2="test";

为什么str1可以编译而str2不能?看不懂,谢谢

4

2 回答 2

11

C++ 语言有一条规则规定不能将非 const 左值引用(例如std::string&)绑定到临时值。您的表达式的 RHS 必须产生一个临时std::string对象,该对象只能绑定到const std::string&.

使用这个更简单的代码,您会看到相同的错误,它不涉及任何用户定义的类型或转换构造函数:

int i& = 42;

规则本身是有道理的:改变临时对象的意义是什么?该语言没有尝试处理这种可能令人困惑的情况,而是完全禁止它。当然,与所有规则一样,这在某种程度上是一个武断而务实的决定,我听说一个广泛使用的编译器有一个“扩展”,在某些情况下会破坏这条规则。

于 2013-04-27T14:09:32.800 回答
1
std::string const& str = "test";

通常,引用不能绑定到临时对象;当字符串的生命周期到期时,您将立即拥有一个悬空引用。但是由于引用是const,临时的生命被延长到引用的生命。

但是,当我们通过const引用返回时,我们可以看到它的影响:

std::string const& foo()
{
    return "Hello World";
}

int main()
{
    std::string str = foo(); // runtime error
}

这里字符串被赋值了,所以内部缓冲区str设置为空内存,可能会导致分段错误。一个解决方案是简单地按值返回。

于 2013-04-27T14:47:34.220 回答