繁体   English   中英

构造方法初始值设定项列表和静态成员(私有与受保护)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM