我正在使用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
因此,我认为初始化第一个成员需要初始化每个其他成员,但是只有在初始化第一个成员时才是这种情况。我花了很长时间才弄清楚为什么要发出此消息,这是一个错误吗?还是只有初始化第一个成员static
inline
时才有一个奇怪的要求?
此外,我尝试在onlinegdb.com上使用static
inline
成员,并在C ++ 17中进行编译,似乎它不支持它,因为错误消息是:
错误:ISO C ++禁止非常量静态的类内初始化 成员'Foo :: a'
请参见Online GDB
答案 0 :(得分:3)
这是一个错误吗?
这肯定是MSVC中的bug。
可以在类定义中定义一个
inline
static
数据成员 并可以指定brace-or-equal-initializer。
因此,对于非常量静态内联类成员变量使用default member initialization是可以接受的。