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
(see constexpr 真的需要吗? https://stackoverflow.com/questions/6016771/is-constexpr-really-needed),在这些情况下,可以使用以下方式确保不变性constexpr
?
他在本节的开头指出:
C++ 支持两种不变性概念
他列出了const and 常量表达式,我不相信他试图这么说常量表达式确保不变性优于const它们只是有不同的功能,尽管我承认该句子引用了部分10.4
常量表达式似乎确实意味着,这种解释与文本的其余部分不一致。
一个变量是const
在该范围内是不可变的,但可能不是const
在更大的范围内(例如函数的 const 引用参数)这也许是他试图做出的一个微妙的区别,他说const
:
主要用于指定接口
whereas constexpr
:
这主要用于指定常量,以允许将数据放置在只读存储器中
任何变量是constexpr
应在编译时求值,因此可在需要常量表达式的情况下使用,而作为传递的变量const
函数不一定是const
超出该范围。
当然你可以抛弃恒定性 using const_cast
但试图修改const
对象是未定义的行为,因此它的不可变性不亚于constexpr
从这个意义上说,从C++11 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf部分7.1.6.1
简历限定符:
在其生命周期(3.8)期间修改 const 对象的任何尝试都会导致未定义的行为
乔纳森·韦克利 (Jonathan Wakely) 指出常量表达式变量如const变量可以有一个可变成员 http://open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1405但该成员不能在常量表达式中使用。
请注意,一个常量表达式变量也是const,来自 C++11 标准草案部分7.1.5
constexpr 说明符:
对象声明中使用的 constexpr 说明符声明
对象作为常量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)