![](/img/trans.png)
[英]Throwing exception from member constructor (brace initializer vs initializer list)
[英]Constructor initializer list and static member (private vs protected)
显然,声明为static
的类的数据成员不正确,无法在ctor初始化程序列表中初始化(因为它“不是对象的成员”)。 但是,如果它是protected
成员,则可以正常工作。 为什么?
// 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
从§10.3.8.2C ++ 20标准草案的类/静态成员/静态数据成员开始:
静态数据成员的初始化和销毁与非本地变量完全相同。
因此您的编译器不正确。
您正在使用哪个版本的Visual Studio? 较早的视觉工作室因将标准更多地作为指导而臭名昭著。 在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.