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

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

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


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

查看所有标签

猜你喜欢:

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

《电脑报》2005年合订本(上下)

《电脑报》2005年合订本(上下)

电脑报社主编 / 西南师范大学出版社 / 2006-1 / 45.00元

全套上、下两册,浓缩2005年电脑报精华文章;附录包含70余篇简明IT应用指南,涵盖软件、硬件、数码、网络四大领域,配赠权威实用的2005-2006中国计算机年鉴光盘,近1.4GB海量信息与资源超值奉献,提供2005-2006全系列硬件、数码产品资讯,兼具知识性与资料性,连结购买每年《电脑报合订本》,你将拥有一套完整的实用大型电脑文库。一起来看看 《《电脑报》2005年合订本(上下)》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码