C++17静态内联成员的编译器错误

Compiler error with C++17 static inline members

本文关键字:编译器 错误 成员 静态 C++17      更新时间:2023-10-16

我使用的是Microsoft Visual Studio 2017,据我所见,它确实支持C++17静态内联类变量。我的问题是,如果我让所有成员统一起来,它可以正常工作,但我在初始化某些成员时会遇到编译器错误。在以下示例中:

#include <iostream>
class Foo
{
public:
static inline int a;
static inline int b;
static inline int c;
};

int main()
{
Foo foo;
std::cout << foo.a; // Prints 0
std::cin.ignore();
return 0;
}

它运行良好。

在以下情况下,我会得到编译器错误:

class Foo
{public:
static inline int a = 7; // Initialise
static inline int b;
static inline int c;
}; //ErrorC1001 An internal error has occurred in the compiler. 
class Foo
{public:
static inline int a = 7; // Initialise
static inline int b = 7; // Initialise
static inline int c;
}; //ErrorC1001 An internal error has occurred in the compiler. 
class Foo
{public:
static inline int a = 7; // Initialise
static inline int b = 7; // Initialise
static inline int c = 7; // Initialise
}; // Initialise all three, no error. Works fine.

然而,这是有效的:

class Foo
{public:
static inline int a;
static inline int b = 7; // Initialise second
static inline int c;
}; // Does compile but doesn't initialise 'b' to 7, instead it is 0

因此,我认为初始化第一个成员需要初始化其他每个成员,但只有初始化第一个会员时才会出现这种情况。我花了很长时间才弄清楚它为什么会发出这样的信息,这是一个bug吗?或者,只有在初始化第一个成员的情况下,才初始化所有staticinline成员,这是一个奇怪的要求吗?

此外,我尝试在onlinegdb.com上使用staticinline成员,在C++17中编译,但它似乎不支持它,因为错误消息是:

错误:ISO C++禁止类内初始化非常量静态成员"Foo::a">

请参阅在线GDB

这是一个bug吗?

这肯定是MSVC中的一个错误。

根据class.static.data/3:

可以在类定义中定义inlinestatic数据成员并且可以指定大括号或相等的初始值设定项

因此,对于非常量静态内联类成员变量,使用默认成员初始化是可以接受的。

使用GCC和Clang可以很好地工作。