[英]Encounter the error: defaulted definition of default constructor is not constexpr when compile with clang-cl
我正在嘗試使用帶有 LLVM 15 的 clang-cl 編譯這些代碼。
class Foo
{
public:
constexpr Foo() = default;
private:
int i;
};
int main(void)
{
Foo f;
}
編譯命令行為:
\> bazel build ... --compiler=clang-cl
將顯示錯誤
cpp-constexpr/main.cpp(4,5): error: defaulted definition of default constructor is not constexpr
constexpr Foo() = default;
^
cpp-constexpr/main.cpp(13,9): error: no matching constructor for initialization of 'Foo'
Foo f;
^
cpp-constexpr/main.cpp(6,5): note: candidate constructor not viable: requires 1 argument, but 0 were provided
Foo(const Foo&) = delete;
^
2 errors generated.
Target //cpp-constexpr:constexpr failed to build
如果用MSVC 2022/2019編譯的話,完全不會報錯。 期待知道您的建議。
提前致謝。
TL;DR 版本:編譯為 C++20 或更新版本的 C++ 標准,其中兩個編譯器都應接受此代碼。 缺點:您可能會發現他們對 C++20 的處理存在其他差異,而且情況也好不到哪里去。
解釋:
對於類或結構的構造函數,必須初始化每個基類子對象和每個非變體非靜態數據成員。
這在 C++20 之前有效。 從 C++20 開始,代碼應該按呈現的方式工作(但如果我知道你將如何處理常量未初始化變量i
,就會出現問題。必須深入研究標准或更深入地研究 cppreference 以查看i
是否已初始化為零或其他內容.這個使用 Matt Godbolt 的編譯器資源管理器的實驗表明它沒有被初始化。
所以修復最有可能初始化i
。
class Foo
{
public:
constexpr Foo() = default;
~Foo() = default;
Foo(const Foo&) = delete;
private:
int i = 0;
};
MSVC 在 C++20 之前編譯此代碼的能力似乎是一個可以隨時修復的錯誤。 我建議修復代碼(或將雙方編譯為 C++20 或更新版本),而不是將不正確的行為強加到 clang-cl 上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.