“不允许使用不完整类型”与自己类的静态内联成员

问题描述 投票:0回答:1
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
。为什么?这样做有潜在危险吗?

c++ static inline
1个回答
0
投票

根据class.static.data.3

其类定义中非内联静态数据成员的声明不是定义并且可能是除cv void之外的不完整类型

同时class.static.data.4:

...“内联静态”数据成员的声明(“这是一个定义”)可以指定一个大括号或等于初始化程序。 ... 还有basic.def.5

在对象的定义

中,该对象的类型
不应是不完整类型

([basic.types.general])、抽象类类型([class.abstract])或(可能是多维的) ) 数组。 (强调我的)

这意味着
inline static

数据成员的声明与

static

不同,是定义,因此不能是不完整类型的对象,因此您的示例格式不正确,并且您的 Visual Studio 错误地接受了它。不过,最新的 msvc 没有 (

godbolt
),所以这个问题已经解决了。
    
© www.soinside.com 2019 - 2024. All rights reserved.