是一个constexpr more“;常数;而不是康斯特? C++编程语言第四版- Bjarne Stroustrup:(强调矿山)
2.2.3。常数 在一些地方,语言规则需要常量表达式 (例如,数组边界(§2.2.5,§7.3),大小写标签(§2.2.4,§9.4.2),一些 模板参数(§25.2)和使用constexpr声明的常量)。 在其他情况下,编译时评估对性能很重要。 不受性能问题的影响,不变性的概念(具有不可更改状态的对象)是一个重要的设计问题 (§10.4)。是一个constexpr more“;常数;而不是康斯特? C++编程语言第四版- Bjarne Stroustrup:(强调矿山),c++,c++11,constants,immutability,constexpr,C++,C++11,Constants,Immutability,Constexpr,2.2.3。常数 在一些地方,语言规则需要常量表达式 (例如,数组边界(§2.2.5,§7.3),大小写标签(§2.2.4,§9.4.2),一些 模板参数(§25.2)和使用constexpr声明的常量)。 在其他情况下,编译时评估对性能很重要。 不受性能问题的影响,不变性的概念(具有不可更改状态的对象)是一个重要的设计问题 (§10.4)。 Stroustrup似乎在这里建议constepr比传统的const声明更好地确保对象的不变性。这是正确的吗?有没有办法使constepr比const更安
Stroustrup似乎在这里建议
constepr
比传统的const
声明更好地确保对象的不变性。这是正确的吗?有没有办法使constepr
比const
更安全/更稳定,或者Stroustrup仅仅意味着因为有一些方法使用constepr
而不受const
的支持(请参见),在这些情况下,可以使用constepr
?确保不变性,他在本节开头指出:
C++支持两种不变性的概念
他列出了const和constexpr,我不相信他是想说constexpr比const更能确保不变性,它们只是有不同的特点,尽管我承认这句话引用了10.4
Constant Expressions一节,这似乎暗示着,解释与正文的其余部分不一致
const
变量在该范围内是不可变的,但在更大范围内可能不是const
(例如函数的const引用参数),这可能是他试图做出的细微区别,他说const
:
主要用于指定接口
鉴于constexpr
:
这主要用于指定常量,以允许在只读内存中放置数据
任何constexpr
的变量都应该在编译时求值,因此在需要常量表达式时可用,而作为const
传递给函数的变量不必在该范围之外
当然,您可以使用const\u cast
丢弃constness,但尝试修改const
对象是未定义的行为,因此它不亚于constepr
,从这个意义上讲,从7.1.6.1
节cv限定符:
在常量对象的生存期(3.8)内修改该对象的任何尝试都会导致未定义的行为
Jonathan Wakely注意到,像const variables这样的constexpr变量可以有一个,但该成员不能用于常量表达式中
注意,constexpr变量也是const,来自草案C++11标准部分7.1.5
constexpr说明符:
对象声明中使用的constexpr说明符声明
对象作为常量
const
不能确保按位常量,例如,类可以有可变成员(典型的例子是用于内部同步的私有互斥),并且您可以const\u从指针中抛出常量
constexpr
声明了一个可以在编译时计算的常量变量或函数,这意味着对对象可以是什么有一些限制,但我相信,与const
相比,关键字本身在运行时不会提供任何额外的保证。
另请参见讨论。我找不到我的这本书的副本来检查上下文,但由于constexpr仍然不能保证不变性,如果这是他的建议,我会感到惊讶。“从你的简短引用来看,我觉得他只是在说不变性很重要,并不是说constexpr比const更适合实现这一点,或者反之亦然。”JonathanWakely——也许你是对的,他只是把它放在这里,因为一般的主题就是他所说的不变性。我现在把整段都放在那里了——这是对constexpr
材料的总结,所以我知道constexpr
有一些特别之处,就像这里提到的其他几点一样,但可能没有。@Jonathanwelly我想让它模棱两可的是具体陈述中引用章节的方式,他们似乎暗示了OP在问什么。我同意,我也不相信他是在暗示,但在读了好几遍之后,即使从整个上下文来看,这也不是最清楚的陈述。。是的,明白了。这就是问题的全部内容:如何修改声明中的myConst
值:const int myConst=999
?编译器强制执行const
。也许用指针来破坏它?如果使用constexpr
,这是不可能的吗?constepr
是否有“更不可变”的地方?我不确定我是否理解这个答案,除非变量作为const
传递到函数中,因此它们不能在函数中修改。“const对象在该范围内是不可变的,但在更大范围内可能不是const”从技术上讲,一个对象要么是常量,要么不是常量,周期。非常量对象可以通过“常量访问路径”(例如,通过常量指针)使用,但对象本身仍然是非常量的。immutable并不仅仅意味着“现在不会改变,但以后可能会改变”。@JonathanWakely这就是我在睡觉前写下它所得到的,修正了。正如MikeMB的回答所示,声明为constexpr的变量仍然可以有可变成员,因此不是真正的编译时常量。@JonathanWakely这是一个有趣的边缘情况,在这一点上,我将其改写为不那么绝对的。用constexpr声明的对象仍然可以有可变成员,即使在重新声明之后