需要解释以下c++中的表达式

jucafojl  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(100)
static constexpr char const* const s_empty = "";

更像是验证问题。根据我的理解,constexpr会让s_empty说明符声明可以在编译时计算变量的值。这意味着编译器可以将其替换为const折叠。
char/cost* 会使指针赋值不可行,最后的const会使被引用的变量不可更改。
我希望那是正确的

wydwbb8l

wydwbb8l1#

constexpr将使s_empty说明符声明可以在编译时计算变量的值
constexpr强制变量由常量表达式初始化,并使变量可用作其他常量表达式的一部分。常量表达式可以在编译时求值,本质上,如果标记为constexpr,编译器必须在编译时对变量的值进行求值(因为它需要诊断初始化是否是常量表达式)。
例如,如果需要计算数组变量的范围,并且计算需要使用s_empty,那么s_empty(可能)需要是constexpr,以便使计算成为常量表达式。数组变量的范围是需要常量表达式的上下文之一。
这意味着编译器可以将其替换为const折叠。
编译器不需要考虑constexpr来确定是否可以进行常量折叠。在as-if规则下,只要程序的可观察行为没有改变,它总是可以保持不变的折叠(或进行任何其他优化)。
然而,它可以使用constexpr调整其内部启发式,因为constexpr本质上强制计算值。然而,对于非局部静态存储持续时间变量,编译器无论如何都必须检查初始化是否是常量表达式,而不管constexpr,因为如果这些变量由常量表达式初始化,则它们可能没有动态初始化(在运行时)。
char/cost* 将使对指针的赋值不可行
左侧的const适用于char,而不是指针。它使得指针指向的 value 不能被修改。这是意料之中的,因为您将其指向一个字符串文字,而该字符串文字是不允许修改的(并且本身已经是const)。
最后的const会使被引用的变量不可变。
最后的const使 pointer 值不可修改,但完全是冗余的,因为constexpr已经暗示了顶级const

相关问题