转换后的常量表达式写法

Kry*_*n S 0 c++ language-lawyer

[expr.const] p9定义转换后的常量表达式为:

\n\n
\n

A\xc2\xa0 conversionconstant expression \xc2\xa0of type\xc2\xa0 T\xc2\xa0是一个表达式,隐式转换为类型\xc2\xa0T,其中转换后的表达式是常量表达式,隐式转换序列仅包含 [。 ..]

\n
\n\n

在以下示例中:

\n\n
const int a = 42;\nint b[a];\n
Run Code Online (Sandbox Code Playgroud)\n\n

该标准没有指定应用于的转换是否a是表达式求值的一部分(事实上,它们被认为是完整表达式的一部分,即初始化声明符),并且如果不指定这一点,它实际上意味着任何类型的泛左值表达式int都是转换后的常量表达式,因为转换不是结果纯右值评估的一部分(应用转换,产生纯右值,然后评估该纯右值)。是我错了,还是措辞有缺陷?

\n

L. *_* F. 5

我认为你在这里有点过于怀疑了。在我看来, \xe2\x80\x9cconverted 表达式\xe2\x80\x9d 明确表示 \xe2\x80\x9c 表达式,并执行了必要的转换。\xe2\x80\x9d 如果您将其解释为 \xe2\ x80\x9c 要转换的表达式,\xe2\x80\x9d 过去分词 \xe2\x80\x9cconverted\xe2\x80\x9d 感觉不\xe2\x80\x99 不正确。(另一种选择可能是 \xe2\x80\x9cto-be-converted 表达式。\xe2\x80\x9d)所以不,我不\xe2\x80\x99t 认为这是一个措辞缺陷。

\n\n

在这种情况下,左值通过左值到右值转换a转换为类型的纯右值int,然后再转换为类型的纯右值std::size_t,然后通过整数转换转换为类型的纯右值。这些在常量表达式中是允许的,所以代码没问题。

\n