[英]Constructor initializer list and static member (private vs protected)
It is clear that a data member of a class declared as static
is incorrect to be initialized in ctor initializer list (because it "is not a member" of an object). 显然,声明为static
的类的数据成员不正确,无法在ctor初始化程序列表中初始化(因为它“不是对象的成员”)。 But it works fine if it is a protected
member. 但是,如果它是protected
成员,则可以正常工作。 Why? 为什么?
// foo.h
class Foo {
public:
explicit Foo();
~Foo() = default;
protected:
static int kProtected;
private:
static int kPrivate;
}
// foo.cpp
Foo::Foo()
: kProtected(1), // OK (?!)
kPrivate(1) {} // error C2438: 'kPrivate': cannot initialize static class data via constructor
From §10.3.8.2 Classes/Static members/Static data members of the draft C++20 standard: 从§10.3.8.2C ++ 20标准草案的类/静态成员/静态数据成员开始:
Static data members are initialized and destroyed exactly like non-local variables. 静态数据成员的初始化和销毁与非本地变量完全相同。
so your compiler is incorrect. 因此您的编译器不正确。
Which version of visual studio are you using? 您正在使用哪个版本的Visual Studio? Older visual studios were notorious for treating standard more as a guide. 较早的视觉工作室因将标准更多地作为指导而臭名昭著。 On clang your code gets: 在c中您的代码得到:
<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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.