在“const int i = 13;”中,“i”的前缀“const”意味着它可以用作常量表达式(如模板参数或case标签),并且试图修改它将导致未定义的行为。这是为了向后兼容没有“constexpr”的C++11之前的代码。
声明“void foo(const int k);”和“void foo(int k);”是声明相同函数;参数的顶层“const”不参与函数的签名。参数“k”必须按值传递,因此不能是“真正”的常量。取消其常量性不是未定义的行为。但是,任何尝试修改它仍然是未定义的,因为它是const对象[basic.type.qualifier](1.1):
“const对象是类型为const T的对象或此类对象的非可变子对象。”
根据[dcl.type.cv] 4,const对象无法修改:
“除非任何声明为mutable(10.1.1)的类成员都可以修改,在其生命周期(6.8)期间尝试修改const对象的任何尝试都会导致未定义的行为。”
由于函数参数具有自动存储期,因此其存储中不能创建新对象,也不能通过[basic.life] 10创建曾经占据其存储的const对象的存储中的新对象:
“在完全静态、线程或自动存储期的const对象所占用的存储器内创建一个新对象,或者在其生命周期结束之前曾经占用这样的const对象的存储器内创建一个新对象,都会导致未定义的行为。”
如果计划取消其常量性,那么不清楚为什么首先要将“k”声明为“const”?它唯一的目的似乎是混淆和使模糊不清。
通常我们应该在任何地方都支持不可变性,因为它有助于人们推理。此外,它可能有助于编译器进行优化。然而,在我们仅声明不可变性但不尊重它的情况下,它起到相反的作用并且会引起混淆。
我们应该支持的另一件事是纯函数。这些函数不依赖或修改任何外部状态,也没有副作用。这些函数对人和编译器来说都更容易推理和优化。当前这样的函数可以声明为“constexpr”。但是,据我所知,将按值传递的参数声明为“const”在优化方面并没有帮助,即使在“constexpr”函数的上下文中也是如此。
const
有助于优化 很多。 - yrHeTateJlbconst
在一定程度上会有助于优化,可以说很多。https://youtu.be/zBkNBP00wJE?t=26m55s - user2486888