gpt4 book ai didi

c++ - C++11 标准中的核心常量表达式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:19 25 4
gpt4 key购买 nike

在 C++11 标准(N3690)的最新草案中,有 11 处引用了表达式核心常量表达式,但都没有定义这个实体是什么。

还可以发现表达式 core constant expression 定义得很好 here ,基本上与标准用于定义表达式 conditional-expression 的术语相同。

因此,我想就这个问题征集一些意见,在我看来,这在标准中是错误的。

现在,假设 cppreference 中的定义是正确的我还想知道为什么以下代码片段在 Coliru 中编译在Ideone ,尽管提到的定义中有第 (10) 项?

#include <iostream>

int main()
{
const double x = 2.;
constexpr double y = x;
std::cout << y << std::endl;
}

我特别考虑表达式 constexpr double y = x; 中变量 x左值到右值隐式转换 ,不在上述第(10)项(a)、(b)和(c)的任何条款之列。

感谢您的帮助。

最佳答案

N3690 确实在 5.19p2 [expr.const] 中定义了术语“核心常量表达式”:

A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:

[list omitted]

已发布的 ISO C++ 2011 标准在同一部分对其进行了定义。

至于这是否真的是一个定义,另见第 1.3 节第 3 段:

Terms that are used only in a small portion of this International Standard are defined where they are used and italicized where they are defined.

该标准还对句法类别使用斜体,例如条件表达式,但“核心常量表达式”是一个定义的术语,而不是句法类别(它很微妙,但您可以通过使用来判断空格而不是连字符来分隔单词)。

至于示例代码:

const double x = 2.;
constexpr double y = x;

我对标准的解读是这是无效的,因为 x 不是核心常量表达式。如果 xy 是某种整数或枚举类型,那将是有效的,但 float 没有这样的权限。左值到右值的转换(将对象 x 的名称转换为其值 2.0)在核心常量表达式中是不允许的,除非它符合三个列出的标准之一(参见 C11 5.19,第 9 个项目符号,三个子项目符号)。

这意味着在没有诊断的情况下接受上述代码的编译器是不合格的(即有缺陷的)。 (除非我遗漏了什么,这是完全有可能的。)

这意味着http://en.cppreference.com/w/cpp/language/constant_expression是错的。它说核心常量表达式可能包含左值的左值到右值转换,该左值“具有文字类型并引用用常量表达式定义的对象(或其子对象)”。实际标准有更强的要求:对象必须用constexpr定义。 (也许 cppreference.com 是基于较早的草稿?)

所以示例代码可以通过将其更改为有效:

constexpr double x = 2.;
constexpr double y = x;

关于c++ - C++11 标准中的核心常量表达式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20694579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com