为什么"最重要的const"必须是常量?

时间:2014-04-14 14:47:36

标签: c++ const

http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/中提及"最重要的const"其中C ++故意指定将临时对象绑定到堆栈上对const的引用会将临时对象的生命周期延长到引用本身的生命周期。我想知道为什么c ++只允许在引用为const时延长对象的生命周期,而不是在它不是什么时候?这个特征背后的理性是什么?为什么它必须是const?

3 个答案:

答案 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引用。如果允许的话,还需要延长寿命;允许一些参考在其范围的某些部分变坏然后没有意义。这种行为破坏了引用比指针更安全的概念。