struct Foo
{
inline static Foo F1;
};
由于
‘Foo Foo::F1’ has incomplete type
,这会导致C++11、C++17、C++20的各种在线编译器出现编译错误。在使用 C++17 的 Visual Studio 中,它编译并运行良好,但出现 IntelliSense 警告incomplete type is not allowed
。为什么?这样做有潜在危险吗?
其类定义中非内联静态数据成员的声明不是定义并且可能是除cv void之外的不完整类型。
...“内联静态”数据成员的声明(“这是一个定义”)可以指定一个大括号或等于初始化程序。 ... 还有basic.def.5
:
在对象的定义
中,该对象的类型不应是不完整类型([basic.types.general])、抽象类类型([class.abstract])或(可能是多维的) ) 数组。 (强调我的)
这意味着
inline static
数据成员的声明与
static
不同,是定义,因此不能是不完整类型的对象,因此您的示例格式不正确,并且您的 Visual Studio 错误地接受了它。不过,最新的 msvc 没有 (
godbolt),所以这个问题已经解决了。