簡體   English   中英

consteval 構造函數必須初始化所有數據成員嗎?

[英]Must consteval constructor initialize all data members?

在下一個程序中, struct B有直接consteval默認構造函數,它不初始化i字段。 然后這個構造函數被用來做一個臨時的,它的i字段保持不變:

struct B {
    bool b = true;
    int i;
    consteval B() {}
};

static_assert( B{}.b );

Clang 和 MSVC 都可以。 但是 GCC 抱怨:

 error: 'B{true}' is not a constant expression
    7 | static_assert( B{}.b );
      |                  ^
error: 'B()' is not a constant expression because it refers to an incompletely initialized variable

演示: https://gcc.godbolt.org/z/x4n6ezrhT

哪個編譯器就在這里?

更新:

我向 GCC 報告了這個問題: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104512並在解釋后關閉

這暗示 MSVC 和 clang 都是不正確的。 EDG 還正確地實現了 static_assert 而不是立即的 function 上下文。

來自 cppreference 的consteval 說明符(C++20 起)

consteval 說明符將 function 或 function 模板聲明為立即 function,
...
立即數 function 是一個 constexpr function,並且必須滿足適用於 constexpr functions 或 constexpr constructors 的要求,視情況而定。

如果我們 go 到 cppreference 的constexpr 說明符 (C++11 起)

constexpr function 必須滿足以下要求:
...
一個 constexpr 構造函數,其 function 主體不是 =delete; 必須滿足以下附加要求:
...
對於 class 或結構的構造函數,必須初始化每個基類 class 子對象和每個非變體非靜態數據成員。

但是,正如 @user17732522 在下面的評論中准確指出的那樣,最后一項要求僅適用於C++20

所以我會說在這種情況下i不需要初始化(Clang/MSVC 是正確的,gcc 是錯誤的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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