簡體   English   中英

遇到錯誤:defaulted definition of default constructor is not constexpr when compile with clang-cl

[英]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 的處理存在其他差異,而且情況也好不到哪里去。

解釋:

引用cppreference

對於類或結構的構造函數,必須初始化每個基類子對象和每個非變體非靜態數據成員。

這在 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.

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