簡體   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