簡體   English   中英

什么是C ++ 11標准中的核心常量表達式?

[英]What is a core constant expression in the C++11 Standard?

在C ++ 11標准(N3690)的最新草案中有11個表達式core constant expression引用,它們都沒有定義這個實體是什么。

人們還可以發現表達式core constant expression 在這里定義得很好,基本上與標准用於定義表達式conditional-expression術語相同。

因此,我想在這個問題上獲得一些意見,在我看來,這個問題在標准中是錯誤的。

現在,假設cppreference中的定義是正確的,我還想知道為什么下面的代碼片段在ColiruIdeone中編譯,盡管在提到的定義中有第(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 conversionlvalue 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 不是 核心常量表達式 如果xy是某種整數或枚舉類型,那么它是有效的,但是沒有浮點數的這種許可。 除非符合三個列出的標准之一,否則不允許在核心常量表達式中進行左值到右值的轉換(將對象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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM