为什么"most important const"必须是恒常的?

Why does "most important const" have to be const?

本文关键字:most important const 为什么      更新时间:2023-10-16

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

这里有一个例子:

void square(int &x)
{
  x = x * x;
}
int main()
{
  float f = 3.0f;
  square(f);
  std::cout << f << 'n';
}

如果临时值可以绑定到非常量左值引用,那么上面的内容会很好地编译,但会产生相当令人惊讶的结果(3而不是9的输出)。

考虑以下内容:

int& x = 5;
x = 6;

如果允许,会发生什么?相比之下,如果你做

const int& x = 5;

则没有合法的方式来修改CCD_ 3。

请注意,const引用可以绑定到通常甚至没有地址的对象。const int &函数参数可以采用由字面常量表达式42形成的参数。我们不能获取42的地址,因此不能将其传递给获取const int *的函数。

const引用特别"幸运"地能够绑定到这样的右值。

当然,对于像2 + 2这样的传统价值观来说,寿命不是问题。这是类类型的右值的问题。

如果允许将引用绑定到某个对象,而与42不同,该对象没有普遍生存期,则该生存期将被扩展,以便引用在其整个范围内保持正常。

这并不是说常量会导致生存期延长,而是不允许使用非常量引用。如果允许,还需要延长使用寿命;允许一些引用是没有意义的,然后在其范围的某些部分出现问题。这种行为破坏了引用比指针更安全的概念。