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

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

内容简介:代码日志版权声明:翻译自: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


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

查看所有标签

猜你喜欢:

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

编程人生(上卷)

编程人生(上卷)

[美] Peter Seibel / 图灵社区 / 人民邮电出版社 / 2014-12 / 39.00元

这是一本访谈笔录,记录了当今最具个人魅力的15 位软件先驱的编程生涯。包括Donald Knuth、Jamie Zawinski、Joshua Bloch、Ken Thompson等在内的业界传奇人物,为我们讲述了他们是怎么学习编程的,在编程过程中发现了什么以及他们对未来的看法,并对诸如应该如何设计软件等长久以来一直困扰很多程序员的问题谈了自己的观点。中文版分为上下卷,上卷介绍8位大师。一起来看看 《编程人生(上卷)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码