3

次の点に注意してください。

#include <iostream>
#include <string>
#include <cstdlib>

int main(){

    static std::string foo = "inside main";

    struct Bar{
        Bar(){
            std::cout << "I can see " << foo << '\n';
        }
    };

    Bar b;

    return EXIT_SUCCESS;
}

このプログラムの出力は次のとおりです。「メインの内部が見えます」。

クラスコンストラクターがクラス定義の外を見てfooを見つけることができるのはなぜですか?

fooが静的である場合、クラス定義と同じ関数内でのみ機能し、クラス定義の前にあります。


それが範囲の規則に違反していないことを私に納得させるのを手伝ってください。なぜそれが可能ですか?そのような実装の利点と落とし穴は何ですか?

4

1 に答える 1

5

struct Barこれは、main()の名前空間内にあり、であるためfooですstatic。標準は言う:

クラスは関数定義内で定義できます。このようなクラスはローカルクラスと呼ばれます。ローカルクラスの名前は、それを囲むスコープに対してローカルです。ローカルクラスは、囲んでいるスコープのスコープ内にあり、囲んでいる関数と同じように、関数の外部の名前にアクセスできます。ローカルクラスの宣言では、型名、静的変数、外部変数と関数、および囲んでいるスコープの列挙子のみを使用できます。

したがって、コードは標準に違反していません。

于 2012-11-17T03:40:02.643 に答える