C++ 什么是C++;11标准?

C++ 什么是C++;11标准?,c++,c++11,language-lawyer,constant-expression,C++,C++11,Language Lawyer,Constant Expression,在最新的C++11标准草案(N3690)中,有11个对表达式核心常量表达式的引用,其中没有一个定义了该实体是什么 您还可以发现,表达式核心常量表达式的定义非常好,基本上与标准用于定义表达式条件表达式的术语相同 因此,我想就这个问题获得一些意见,在我看来,这在标准中是错误的 现在,假设中的定义是正确的,我还想知道为什么下面的代码段编译为in和in,而不考虑所提及的定义中的第(10)项 #include <iostream> int main() { const double

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

您还可以发现,表达式
核心常量表达式
的定义非常好,基本上与标准用于定义表达式
条件表达式
的术语相同

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

现在,假设中的定义是正确的,我还想知道为什么下面的代码段编译为in和in,而不考虑所提及的定义中的第(10)项

#include <iostream>

int main()
{
    const double x = 2.;
    constexpr double y = x;
    std::cout << y << std::endl;
}
#包括
int main()
{
常数双x=2。;
constexpr双y=x;
std::cout在5.19p2[expr.const]中定义了术语“核心常量表达式”:

条件表达式e是核心常量表达式,除非 按照抽象机器(1.9)的规则对e进行评估, 将计算以下表达式之一:

[列表略去]

<发布的ISO C++ 2011标准定义在同一节。

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

仅在本国际协议一小部分中使用的术语 标准在使用的地方定义,在使用的地方用斜体表示 定义

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

至于示例代码:

const double x = 2.;
constexpr double y = x;
我对标准的理解是,这是无效的,因为
x
不是一个核心常量表达式。如果
x
y
是某个整数或枚举类型,则这是有效的,但对浮点没有这样的权限。左值到右值的转换(在核心常量表达式中不允许将对象的名称
x
转换为其值
2.0
),除非它满足三个列出的标准之一(参见C11 5.19,第9个项目符号,三个子项目符号)

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

这意味着这是错误的。它说核心常量表达式可能包含左值的左值到右值转换,左值“具有文字类型并引用使用常量表达式定义的对象(或其子对象)”。实际标准有一个更严格的要求:必须使用
constepr
定义对象。(也许cppreference.com是基于早期的草案?)

因此,可以通过将示例代码更改为:

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

这不是最新的草案(n3797/github repo),核心常量表达式在[expr.const]/2中定义:“条件表达式e是核心常量表达式,除非按照抽象机器(1.9)的规则对e求值,将对以下表达式之一求值:[……]“好吧,
double
是一种文字类型,所以b)应该适用。嗯,也许你只是误解了[expr.const]/2?它用条件表达式定义了一个核心常量表达式,而不是反过来。条件表达式是在[expr.cond]中定义的。@DyP”这不是最新的草案。请参阅
最新的公开草案
此处()。5.19p2定义了
条件表达式
而不是
核心常量表达式
。请参阅新注释。另一种方法是:5.19p2定义核心常量表达式。WG21页面可能已过时,请参阅和(它已引用N3797)英语不是我的母语。但是读上面的断言,我就是看不到这是一个“代码>核心常量表达式< /代码>的定义。你能解释一下吗?答案是正确的,这个段落定义了一个核心常量表达式。考虑一个类似的定义成人的结构:“人是成年人,除非那时不到18岁。”。它将核心常量表达式定义为条件表达式的子集。@JonathanWakely“它将核心常量表达式定义为条件表达式的子集”如果是这样,那么这个定义如何应用于代码段中的表达式
constexpr double y=x;
,因为
x
显然不是一个条件表达式?
x
是一个条件表达式,它的顶级运算符不是赋值或逗号。条件表达式不需要有de>?:
条件运算符。请看语法。@KeithThompson语法中没有任何东西告诉我
x
是一个条件表达式。