C ++编程语言第四版 - Bjarne Stroustrup :(强调我的)
2.2.3。常量
在一些地方,语言规则需要常量表达式
(例如,数组边界(§2.2.5,§7.3),案例标签(§2.2.4,§9.4.2),一些
模板参数(第25.2节)和使用constexpr声明的常量。
在其他情况下,编译时评估对性能很重要。
独立于性能问题,不可变性(具有不可更改状态的对象)的概念是一个重要的设计问题
(第10.4节)。
Stroustrup似乎在这里暗示 constexpr
确保物体的不变性比传统的更好 const
宣言。它是否正确?有没有办法 constexpr
可以更安全/更不稳定 const
,或者Stroustrup只是意味着因为有方法可以使用 constexpr
不支持的 const
(看到 constexpr真的需要吗?),在这些情况下,可以确保使用不变性 constexpr
?
他在本节开头说:
C ++支持两种不可变性的概念
他列出了 常量 和 constexpr,我不相信他是在试图这么说 constexpr 确保不变性比 常量 他们只是有不同的功能,虽然我承认句子引用部分的事实 10.4
常数表达式 似乎暗示,这种解释与文本的其他部分不一致。
一个变量 const
在该范围内是不可变的但可能不是 const
在更大的范围内(例如,函数的const引用参数他说,这可能是他试图制造的一种微妙的区别 const
:
主要用于指定接口
而 constexpr
:
这主要用于指定常量,以允许将数据放在只读存储器中
任何变量都是 constexpr
应该在编译时进行评估,因此可以在需要常量表达式的情况下使用,而传递为的变量 const
一个功能不一定是 const
超出范围。
当然你可以扔掉 常量性 运用 const_cast
但试图修改一个 const
对象是未定义的行为,因此它不会变得不可变 constexpr
从这个意义上说,来自 草案C ++ 11标准 部分 7.1.6.1
cv资格赛:
任何在其生命周期内修改const对象的尝试(3.8)都会导致未定义的行为
乔纳森威克利注意到了 constexpr 像变量一样 常量 变量可以有一个 可变成员 但该成员不能用于常量表达式。
注意一个 constexpr 变量也是 常量,来自草案C ++ 11标准部分 7.1.5
constexpr说明符:
对象声明中使用的constexpr说明符声明了
对象为const。
const
不能确保按位常数,例如,因为类可以有可变成员(典型的例子是内部同步的私有互斥),你可以 const_cast
从指针中取出常量。
constexpr
声明一个可以在编译时计算的常量变量或函数,这意味着对对象的内容有一些限制,但我相信,关键字本身在运行时没有提供任何额外的保证。 const
。
也可以看看 这个 讨论。