Soruma göre statik üye başlatıcıları için lambda kapsamı.Statik üyeler için lambda kapsamı başlatıcı
#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;
}
4,8 başlayarak GCC S kapsamındaki lambda tanımlar, böylece programın böyle bir şey verir:
Hello from S::<lambda()>
(gcc-4.8.2 farklı bir tanım, aşağıdaki de dikkate almak __FUNCTION__
& Co makroları için, ama yine de lamda yine) S
içinde
, böylece program çıkışları
0 tanımlanırHello from <lambda()>
Muhtemelen daha yeni gcc daha uyumludur. Ancak standardın aslında bu yönü belirleyip belirlemediğini ya da uygulamaya bağlı olabileceğini sormak istiyorum.
Güncelleme: @ user5434961 gibi tüm __FUNCTION__
-alike makro uygulama bağımlı olduğunu ileri sürdü, bu yüzden bir standart uyumlu testinde bunları önlemek için daha iyidir. ama ilgili hata raporu bulamıyorum önce
#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;
}
Güncellenmiş örnekte 'S :: s_field' i' s_field' olarak değiştirmelisiniz? Aksi takdirde, kapsam her ne olursa olsun derler. – Lingxi
"S :: s_field" özel olduğu için, global kapsamdan erişilemez, bu nedenle kod gerçekten GCC-4.7'deki derlemeyi bozar. – user3159253
Evet, evet. Özel olanı gözden kaçırdım. – Lingxi