2
const string& s = "rajat";

works while

string& s = "rajat";

doesn't. Why?

4

2 回答 2

3

"rajat"不是 a std::string,它是一个以 null 结尾的六个数组char,即char[6]

您可以std::string从一个以 null 结尾的数组构造 a char,这就是您编写时会发生的情况:

std::string s = "rajat";

当你想初始化 a 时string&,你必须有一个string要绑定到的引用,所以编译器会尝试stringchar数组构造 a 并将引用绑定到那个,即

std::string& s = std::string("rajat");

但是这是非法的,因为string构造的是临时对象,并且非常量引用不能绑定到临时对象,请参阅非 const 引用为什么不能绑定到临时对象?

于 2013-06-16T13:52:49.207 回答
2

string这将隐式地从 RHS 上的字符串文字构造一个临时值。然后临时绑定到一个引用:

const string& s = "rajat";
//                 ^^^^^ temporary string is constructed from "rajat" literal

该语言只允许const引用绑定到临时对象,所以这

string& s = "rajat";

是非法的,因为它试图将非常量引用绑定到临时string.

请参阅此相关的 GotW 帖子,该帖子也涉及生命周期问题。

于 2013-06-16T10:14:52.813 回答