inline static
Clangでクラスメンバーを使用すると、メンバーが別のクラス/構造体である場合に予期しない動作が発生します:https://godbolt.org/z/mbH6k7
// std=c++17
#include <iostream>
struct A {
double a = 42;
A() { std::cout << "A()" << std::endl; }
};
inline static A a{}; // No problem
namespace N {
inline static A a{}; // No problem
}
struct B {
B() { std::cout << "B()" << std::endl; }
inline static double d; // No problem with built-in types
A& a1 = N::a; // No problem
inline static A a2 = N::a; // No problem
inline static A a3{}; // <-- Problem here!
};
B b1;
inline static B b2;
int main() {
return 0;
}
期待される出力、Clang 8.0.0、gcc、msvcで動作します:
A()
A()
A()
B()
B()
Clang 9.0.0以降の実際の出力:139 (SIGSEGV)
。
これはバグですか、それとも何が欠けていますか?
これは私にはかなりカットアンドドライのバグのように聞こえます:
インライン静的データメンバーは、クラス定義で定義でき、中括弧または等しい初期化子を指定できます。
あなたのコードはこれに準拠しています:
struct B {
// ...
inline static A a3{};
};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加