10

静的メンバーを持つクラスがあります。これは、同じクラスのプライベート静的関数を使用して初期化されます。静的メンバーの初期化中にプライベート静的関数にアクセスする

#include <iostream> 
#include <string> 

class A 
{ 
public: 
    static std::string const s; 

private: 
    static std::string make() 
    { 
     return "S"; 
    } 
}; 

std::string const A::s = A::make(); 

int main() 
{ 
    std::cout << A::s << std::endl; 
    // std::cout << A::make() << std::endl; // <-- Does not work 
    return 0; 
} 

私の質問は次のとおりです。これはどのルールのためですか?明らかに、私はクラスの外からプライベート関数にアクセスすることが許可されていないので、コメント部分は機能しません。スタートアップ時にプライベート静的メンバーを初期化するのはなぜ特別なケースですか? (このノートの意図は何ですか?この正確なケースを許可するのですか?)

私はスタティックメンバー(ここではInitializing private static membersなど)を初期化するための他のメカニズムについて認識しています。しかし私の場合、メンバーはconstなので、それを設定する唯一の方法は、定義の場所での直接の初期化によるものです。

答えて

8

スタティックデータメンバの初期化は、静的データメンバが(クラス定義外の)名前空間スコープで定義されていても、クラスのキャラクタライゼーションの一部とみなされるためです。規格から

$9.2.3.2/2 Static data members [class.static.data]:静的データメンバーの定義に

(強調鉱山)

初期発現は、そのクラス([basic.scopeの範囲です。クラス])。

[例:

class process { 
    static process* run_chain; 
    static process* running; 
}; 

process* process::running = get_main(); 
process* process::run_chain = running; 

クラスprocessの静的データメンバrun_chainをグローバル 範囲で定義されています。 process::run_chainという表記は、メンバー run_chainがクラスprocessのメンバーであり、クラス processの範囲であることを示しています。静的データメンバ定義では、初期化子 は、processの静的データメンバrunningを表します。 - 終了例]

+1

あなたはconstについて正しいです。質問を編集しました。ありがとう。 –

+1

私はそれが明確になるであろうと思い、「静的データメンバの初期化は、静的データメンバは(クラス定義外)名前空間スコープで定義されているにもかかわらず、クラスの特徴付けの一部とみなされます。」 (「クラス定義」はC++標準では非常に正式な意味を持っているため、「特性」を使用しています) –

+0

@MartinBonner Fine。 – songyuanyao

関連する問題