为什么关于const引用的代码示例在c ++中是不同的

时间:2013-04-27 14:08:10

标签: c++ string const

const string &str1="test";

string &str2="test";

为什么str1可以编译但是str2不能编译?我无法理解, 谢谢,

2 个答案:

答案 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的内部缓冲区设置为空内存,可能会导致分段错误。解决方案是简单地按值返回。