Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是一个constexpr more“;常数;而不是康斯特? C++编程语言第四版- Bjarne Stroustrup:(强调矿山)_C++_C++11_Constants_Immutability_Constexpr - Fatal编程技术网

是一个constexpr more“;常数;而不是康斯特? C++编程语言第四版- Bjarne Stroustrup:(强调矿山)

是一个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更安

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

确保不变性,他在本节开头指出:

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声明的对象仍然可以有可变成员,即使在重新声明之后