【问题标题】:Constructor initializer list and static member (private vs protected)构造函数初始化列表和静态成员(私有与受保护)
【发布时间】:2019-08-06 02:11:45
【问题描述】:

很明显,声明为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

【问题讨论】:

  • 我在 MSVC v19 上遇到了 2 个错误:godbolt.org/z/AXorG-
  • 你用的是什么版本的visual studio?

标签: c++ visual-studio initializer-list


【解决方案1】:

来自 C++20 标准草案的 §10.3.8.2 类/静态成员/静态数据成员:

静态数据成员的初始化和销毁​​与非局部变量完全一样。

所以你的编译器不正确。

【讨论】:

  • “您的编译器不正确”针对标准草案版本?这是一个有点牵强的说法。特别是当问题有c++11 标签时。
  • @Yksisarvinen 这根本不是“有点牵强”。这只是最新的规范——他们都这么说。 C++17 标准 §12.2.3.2:“静态数据成员的初始化和销毁​​与非局部变量完全一样”。 C++14 标准第 9.4.2 节:“静态数据成员的初始化和销毁​​就像非局部变量一样”。 C++11 标准的位置与 C++14 标准完全相同:第 9.4.2 节:“静态数据成员的初始化和销毁​​与非局部变量完全一样”。
【解决方案2】:

您使用的是哪个版本的 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.

【讨论】:

  • 这不是真正的答案,而是评论。请不要滥用答案框
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2016-08-17
  • 2012-07-22
  • 2011-02-15
  • 2020-03-22
  • 2016-11-29
相关资源
最近更新 更多