内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/23428684/is-a-constexpr-array-necessarily-odr-used-when-subscripted
struct A { static constexpr int a[3] = {1,2,3}; }; int main () { int a = A::a[0]; int b [A::a[1]]; }
是A :: a必须 odr-used 在int a = A :: a [0]?
注意:这个问题代表了 a debate in the Lounge 不太有趣/不合逻辑/无止尽的版本.
首先使用A :: a:
int a = A::a[0];
初始化器是一个常量表达式,但这并不能阻止A :: a在这里被使用.而且,这个表达式使用的是A :: a.
从表达式A :: a [0]开始,我们来看看[basic.def.odr](3.2)/ 3(对于未来的读者来说,我使用N3936的措辞):
A variable x
[in our case, A::a
] whose name appears as a potentially-evaluated expression ex [in our case, the id-expression
A::a
] is odr-used
unless
-
applying the lvalue-to-rvalue conversion to
x
yields a constant expression [it does]that does not invoke any non-trivial functions [it does not] and,
-
if
x
is an object [it is],-
ex
is an element of the set of potential results of an expressione
, where either the lvalue-to-rvalue conversion is applied toe
, ore
is a discarded-value expression.
-
那么,e的可能价值在哪里?表达式的一组潜在结果是一组表达式的子表达式(可以通过阅读[basic.def.odr](3.2)/ 2)来检查这一点,所以我们只需要考虑哪个表达式是子表达式.那些是:
A::a A::a[0]
其中,lvalue-to-rvalue转换不会立即应用于A :: a,所以我们只考虑A :: a [0]. Per [basic.def.odr](3.2)/ 2,A :: a [0]的潜在结果集是空的,所以这个表达式使用了A :: a.
现在,你可以说我们首先将A :: a [0]改写成*(A :: a 0).但是这并没有改变:e的可能值
A::a A::a + 0 (A::a + 0) *(A::a + 0)
其中,只有第四个具有应用于其的左值向右值转换,而[basic.def.odr](3.2)/ 2则表示*(A :: a 0)的潜在结果集是空.特别地,注意,数组到指针的衰减不是一个左值转换([conv.lval](4.1)),尽管它将一个数组的值转换成一个指针rvalue – 它是一个数组 – 指针转换([conv.array](4.2)).
第二次使用A :: a:
int b [A::a[1]];
这与第一种情况没有区别,按照标准.再次,A :: a [1]是一个常量表达式,因此这是一个有效的数组约束,但编译器仍然允许在运行时发出代码来计算此值,并且数组约束仍然是odr-使用A :: a .
请注意,常量表达式是(默认情况下)潜在评估的表达式. Per [basic.def.odr](3.2)/ 2:
An expression is potentially evaluated unless it is an unevaluated operand (Clause 5) or a subexpression thereof.
[expr](5)/ 8只是重定向到其他子句:
In some contexts, unevaluated operands appear (5.2.8, 5.3.3, 5.3.7, 7.1.6.2). An unevaluated operand is not evaluated.
这些细节表示(分别)某些类型表达式的操作数,sizeof的操作数,noexcept的操作数以及decltype的操作数是未经评估的操作数.没有其他类型的不确定的操作数.
代码日志版权声明:
翻译自:http://stackoverflow.com/questions/23428684/is-a-constexpr-array-necessarily-odr-used-when-subscripted
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 程序猿修仙之路--数据结构之你是否真的懂数组?
- ES5和ES6中,都怎么判断变量是否为数组?
- 是否,是否,总是富肥穷瘦?
- 容器是否取代了虚拟机,这四大理由是否打动你?
- BERT是否完美,语言模型又是否真正地「理解了语言」呢?
- objective-c – 如何检查CGSize是否已初始化(或者其值是否与“nil”不同)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
复盘+:把经验转化为能力(第2版)
邱昭良 / 机械工业出版社 / 39.00
随着环境日趋多变、不确定、复杂、模糊,无论是个人还是组织,都需要更快更有效地进行创新应变、提升能力。复盘作为一种从经验中学习的结构化方法,满足了快速学习的需求,也是有效进行知识萃取与共享的机制。在第1版基础上,《复盘+:把经验转化为能力》(第2版)做了六方面修订: ·提炼复盘的关键词,让大家更精准地理解复盘的精髓; ·基于实际操作经验,梳理、明确了复盘的"底层逻辑"; ·明确了复......一起来看看 《复盘+:把经验转化为能力(第2版)》 这本书的介绍吧!