2017-08-03 4 views
1

だから私は(私はgccのバージョン5.1.0を使用しています)このコードを書き、それがコンパイルされたときに種類の驚いた:実際にタイプの宣言ごとにグローバル変数を作成できますか?

struct Mine 
{ 
    const int* ptr; 
    Mine(const int x) 
     : ptr([=]() 
     { 
      static const int n = x; 
      return &n; 
     }() 
     ){} 
}; 
Mine first = 12; 
Mine second = 13; 

私は驚いていた理由は、Mineの各宣言は、新たな「グローバル」を作成することです変数。だからここ

は質問です:

私はこれを行うには許されることになっているだろうか?

+1

[ラムダ関数オブジェクトの静的変数はどのように機能しますか?](https://stackoverflow.com/questions/8391058/how-do-static-variables-in-lambda-function-objects-work) –

+0

'n'が実際に2つのオブジェクト間で異なる値であるかどうか確認しましたか?通常の関数では、 'static'変数は最初の呼び出しでのみ初期化されるためです。 –

答えて

4

nは1つだけあり、ptrはすべて等しいです。

+0

私はそれが何かのようになると思った – DarthRubik

+0

なぜなら、すべてのnは定数なので、それは私にエラーや警告を与えませんでした(それで複数の値を与えることは意味がありません)。 – DarthRubik

+3

@DarthRubikなぜでしょうかそれはあなたに警告を与える?最初にラムダを呼び出すと、 'n'が初期化されます。たびにポインタを返します。 – Yakk

関連する問題