为什么"most important const"必须是恒常的?
Why does "most important const" have to be const?
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
不同,该对象没有普遍生存期,则该生存期将被扩展,以便引用在其整个范围内保持正常。
这并不是说常量会导致生存期延长,而是不允许使用非常量引用。如果允许,还需要延长使用寿命;允许一些引用是没有意义的,然后在其范围的某些部分出现问题。这种行为破坏了引用比指针更安全的概念。
相关文章:
- 在 C/C++ 中,是否可以通过使用指针更改"important"内存地址的值来创建简单的恶意软件?
- 如何理解"most modern linkers will remove redundant code like template instantiations."
- "Loop will run at most once (loop increment never executed)" C++
- 在一个不带参数的函数的声明中指定void是否解决了Most Vexing Parse
- "most vexing parse"中的括号应该做什么?
- "most derived object"是什么意思?
- 如何"most people seriously overuse casts"?
- 了解'most vexing parse' - 为什么允许歧义语法?
- "most important const"与auto_ptr:为什么代码无法编译?
- C++ - "Most important const"不适用于表达式?
- 有没有办法强制"most vexing parse"是错误的,即使是逐个类?
- 再次"Most Important Const"
- 为什么"most important const"必须是恒常的?
- "Most important const"条件表达式?