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