[英]What rules of C++11 standard are used to determine the type of the expression in ({ … })
[英]What is a core constant expression in the C++11 Standard?
在C ++ 11標准(N3690)的最新草案中有11個表達式core constant expression
引用,它們都沒有定義這個實體是什么。
人們還可以發現表達式core constant expression
在這里定義得很好,基本上與標准用於定義表達式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;
lvalue to rvalue implicit conversion
變量x
lvalue to rvalue implicit conversion
的lvalue to rvalue implicit conversion
constexpr double y = x;
,上述第(10)項中的任何條款(a),(b)和(c)均未涵蓋。
謝謝您的幫助。
N3690 確實定義了“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號子彈,三個子項目符號)。
這意味着在沒有診斷的情況下接受上述代碼的編譯器是不符合的(即,錯誤)。 (除非我遺漏了一些東西,這完全有可能。)
這意味着http://en.cppreference.com/w/cpp/language/constant_expression是錯誤的。 它表示核心常量表達式可能包含左值的左值到右值的轉換,“左值”具有文字類型並且引用用常量表達式(或其子對象)定義的對象“。 實際標准有更強的要求:必須使用constexpr
定義對象。 (也許cppreference.com是基於早期的草案?)
因此,通過將示例代碼更改為:
constexpr double x = 2.;
constexpr double y = x;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.