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