Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数初始值设定项列表和静态成员(私有与受保护)_C++_Visual Studio_Initializer List - Fatal编程技术网

C++ 构造函数初始值设定项列表和静态成员(私有与受保护)

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?老的视觉工

显然,在ctor初始值设定项列表中初始化声明为
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.