const string &str1="test";
string &str2="test";
为什么str1可以编译但是str2不能编译?我无法理解, 谢谢,
答案 0 :(得分:11)
有一条C ++语言规则规定您不能将非const左值引用(例如std::string&
)绑定到临时值。表达式的RHS必须生成一个临时std::string
对象,该对象只能绑定到const std::string&
。
您会在这个更简单的代码中看到相同的错误,该代码不涉及任何用户定义的类型或转换构造函数:
int i& = 42;
规则本身是有道理的:更改临时对象的含义是什么?该语言不是试图处理这种可能令人困惑的情况,而是完全禁止它。当然,与所有规则一样,它在某种程度上是一个任意和务实的决定,我听说一个广泛使用的编译器有一个“扩展”,在某些情况下会打破这个规则。
答案 1 :(得分:1)
std::string const& str = "test";
通常,引用不能绑定到临时对象;当字符串的生命周期到期时,你就会有一个悬空引用。但由于引用是const
,临时的生命延伸到参考的生命。
但是,当我们通过const
引用返回时,我们可以看到这种影响:
std::string const& foo()
{
return "Hello World";
}
int main()
{
std::string str = foo(); // runtime error
}
此处字符串已被赋值消失,因此str
的内部缓冲区设置为空内存,可能会导致分段错误。解决方案是简单地按值返回。