Meine Frage bezieht sich auf Lambda-Bereich für die statischen Elementinitialisierer. Betrachten Sie den folgenden Test:Lambda-Bereich für statische Member-Initialisierer
#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 von 4,8 Start definiert die Lambda im Rahmen von S, so gibt das Programm etwas wie folgt aus:
Hello from S::<lambda()>
(gcc-4.8.2 hat eine andere Definition für __FUNCTION__
& Co-Makros, aber dennoch wird das Lambda noch definiert innerhalb S
)
Inzwischen gcc-4.7 Lambda im globalen Bereich definiert, so dass das Programm Ausgänge
Hello from <lambda()>
Wahrscheinlich neuere gcc sind mehr standardkonform. Ich möchte jedoch fragen, ob der Standard diesen Aspekt tatsächlich spezifiziert oder ob er von der Implementierung abhängig ist.
aktualisieren: wie @ user5434961 vorgeschlagen, dass all __FUNCTION__
-alike Makros Implementierung abhängig ist, so ist es besser, sie in einem standardkonformen Test zu vermeiden. So, hier ist das Beispiel, das kompiliert werden kann, wenn ein Compiler solche lambdas innerhalb S
Umfang definiert und bricht die Kompilierung anders:
#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;
}
Ich denke, Sie sollten 'S :: s_field' in nur 's_field' in dem aktualisierten Beispiel ändern? Ansonsten denke ich, es kompiliert immer, was der Umfang ist. – Lingxi
Nun, da 'S :: s_field' privat ist, kann nicht aus dem globalen Bereich zugegriffen werden, so dass der Code die Kompilierung auf GCC-4.7 tatsächlich bricht – user3159253
Ja, ja. Ich übersah das Private. – Lingxi