c++ 在下标时是否必须使用一个const expr数组?

栏目: C++ · 发布时间: 6年前

内容简介:代码日志版权声明:翻译自: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 expression e , where either the lvalue-to-rvalue conversion is applied to e , or e 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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

复盘+:把经验转化为能力(第2版)

复盘+:把经验转化为能力(第2版)

邱昭良 / 机械工业出版社 / 39.00

随着环境日趋多变、不确定、复杂、模糊,无论是个人还是组织,都需要更快更有效地进行创新应变、提升能力。复盘作为一种从经验中学习的结构化方法,满足了快速学习的需求,也是有效进行知识萃取与共享的机制。在第1版基础上,《复盘+:把经验转化为能力》(第2版)做了六方面修订: ·提炼复盘的关键词,让大家更精准地理解复盘的精髓; ·基于实际操作经验,梳理、明确了复盘的"底层逻辑"; ·明确了复......一起来看看 《复盘+:把经验转化为能力(第2版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具