C++ 构造函数初始值设定项列表和静态成员(私有与受保护)
显然,在ctor初始值设定项列表中初始化声明为C++ 构造函数初始值设定项列表和静态成员(私有与受保护),c++,visual-studio,initializer-list,C++,Visual Studio,Initializer List,显然,在ctor初始值设定项列表中初始化声明为static的类的数据成员是不正确的(因为它“不是对象的成员”)。但是,如果它是受保护的成员,则可以正常工作。为什么? // foo.h class Foo { public: explicit Foo(); ~Foo() = default; protected: static int kProtected; private: static int kPrivate; } 您正在使用哪个版本的visual studio?老的视觉工
static
的类的数据成员是不正确的(因为它“不是对象的成员”)。但是,如果它是受保护的成员,则可以正常工作。为什么?
// foo.h
class Foo {
public:
explicit Foo();
~Foo() = default;
protected:
static int kProtected;
private:
static int kPrivate;
}
您正在使用哪个版本的visual studio?老的视觉工作室因将标准更多视为指南而臭名昭著。在叮当声中,您的代码将获得:
<source>:12:7: error: member initializer 'kProtected' does not name a non-static data member or base class
: kProtected(1), // OK (?!)
^~~~~~~~~~~~~
<source>:13:7: error: member initializer 'kPrivate' does not name a non-static data member or base class
kPrivate(1) {} // error
^~~~~~~~~~~
2 errors generated.
:12:7:错误:成员初始值设定项“kProtected”未命名非静态数据成员或基类
:k受保护(1),//正常(?)
^~~~~~~~~~~~~
:13:7:错误:成员初始值设定项“kPrivate”未命名非静态数据成员或基类
kPrivate(1){}//错误
^~~~~~~~~~~
产生2个错误。
来自C++20标准草案§10.3.8.2类/静态成员/静态数据成员:
静态数据成员的初始化和销毁与非局部变量完全相同
因此,您的编译器不正确。我在MSVC v19上得到了两个预期错误:您使用的是什么版本的visual studio?这不是一个真正的答案,而是一个注释。请不要对标准的草稿版本滥用答案框“您的编译器不正确”?这说法有点牵强。特别是当问题有
c++11
标记时。@Yksisarvinen它一点也不“有点牵强”。这只是最新的规格-他们都这么说。C++17标准§12.2.3.2:“静态数据成员的初始化和销毁与非局部变量完全相同”。C++14标准§9.4.2:“静态数据成员的初始化和销毁与非局部变量完全相同”。C++11标准将其放在与C++14标准完全相同的位置:§9.4.2:“静态数据成员的初始化和销毁与非局部变量完全相同”。
<source>:12:7: error: member initializer 'kProtected' does not name a non-static data member or base class
: kProtected(1), // OK (?!)
^~~~~~~~~~~~~
<source>:13:7: error: member initializer 'kPrivate' does not name a non-static data member or base class
kPrivate(1) {} // error
^~~~~~~~~~~
2 errors generated.