static constexpr char const* const s_empty = "";
更像是验证问题。根据我的理解,constexpr会让s_empty说明符声明可以在编译时计算变量的值。这意味着编译器可以将其替换为const折叠。char/cost* 会使指针赋值不可行,最后的const会使被引用的变量不可更改。我希望那是正确的
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。
constexpr
s_empty
const
char
1条答案
按热度按时间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
。