在http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/中提及"最重要的const"其中C ++故意指定将临时对象绑定到堆栈上对const的引用会将临时对象的生命周期延长到引用本身的生命周期。我想知道为什么c ++只允许在引用为const时延长对象的生命周期,而不是在它不是什么时候?这个特征背后的理性是什么?为什么它必须是const?
答案 0 :(得分:24)
以下是一个例子:
void square(int &x)
{
x = x * x;
}
int main()
{
float f = 3.0f;
square(f);
std::cout << f << '\n';
}
如果temporaries可以绑定到非const左值引用,上面会很乐意编译,但会产生相当令人惊讶的结果(输出3
而不是9
)。
答案 1 :(得分:14)
请考虑以下事项:
int& x = 5;
x = 6;
如果允许,会发生什么?相比之下,如果你做了
const int& x = 5;
没有合法的方法来修改x
。
答案 2 :(得分:1)
请注意,const引用可以绑定到通常没有地址的对象。 const int &
函数参数可以采用由文字常量表达式42
形成的参数。我们无法获取42
的地址,因此我们无法将其传递给采用const int *
的函数。
const引用特别“有福”,能够绑定到这样的rvalues。
当然,对于像2 + 2
这样的传统右手,生命周期不是问题。对于类类型的rvalues来说这是一个问题。
如果允许将引用绑定到某个对象,该对象与42
不同,并且没有普遍的生命周期,那么生命周期有要扩展,以便引用保持清醒在整个范围内。
这不是const导致生命周期扩展,而是不允许非const引用。如果允许的话,还需要延长寿命;允许一些参考在其范围的某些部分变坏然后没有意义。这种行为破坏了引用比指针更安全的概念。