私の質問は、静的メンバー初期化子のラムダスコープについてです。以下の試験を検討:4.8から出発静的メンバーの初期化子のラムダスコープ
#include <functional>
#include <iostream>
struct S {
static const std::function<void(void)> s_func;
};
const std::function<void(void)> S::s_func = []() {
std::cout << "Hello from " << __PRETTY_FUNCTION__ << std::endl;
};
int main(void) {
S::s_func();
return 0;
}
GCCはSの範囲にラムダを定義するので、プログラムは、このようなものを出力:
Hello from S::<lambda()>
(GCC-4.8.2は異なる定義を有します__FUNCTION__
&コマクロため、それにもかかわらず、ラムダは依然としてS
内で定義される)
一方GCC-4.7は、グローバルスコープにラムダを定義し、そのプログラム出力
Hello from <lambda()>
おそらく、より新しいgccが標準に準拠しています。しかし、標準が実際にこのアスペクトを指定しているのか、それとも実装に依存しているのかを尋ねたいと思います。
更新は:@ user5434961として全て__FUNCTION__
-alikeマクロは実装に依存していることを示唆し、それは、標準に準拠したテストでそれらを避ける方が良いでしょう。そこでここでは、コンパイラはS
範囲内で、そのようなラムダを定義し、それ以外の場合は、コンパイルを中断した場合にコンパイルすることができます例です。
#include <functional>
#include <iostream>
struct S {
static const std::function<void(void)> s_func;
private:
static const int s_field;
};
const std::function<void(void)> S::s_func = []() {
std::cout << "Hello from S::s_func. S::s_field = " << S::s_field << std::endl;
};
const int S::s_field = 1;
int main(void) {
S::s_func();
return 0;
}
私はあなたが 'にSを変更する必要があります:: s_field'を更新例ではちょうど' s_field'に思いますか?さもなければ、私はそれが常にスコープが何であれコンパイルすると思う。 'S :: s_field'がプライベートであるため、コードは、はい、はい確かにGCC-4.7に – Lingxi
まあ、それはグローバルスコープからアクセスすることはできません。私は私物を見落とした。 – user3159253
をコンパイルを破るないので – Lingxi