[英]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.