我的問題是關於靜態成員初始值設定項的lambda範圍。考慮下面的測試:靜態成員初始值設定項的lambda範圍
#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從4.8開始定義S的範圍拉姆達,所以程序輸出這樣的事情:
Hello from S::<lambda()>
(GCC-4.8.2具有不同的定義爲__FUNCTION__
&鈷宏,但儘管如此拉姆達仍然內S
定義)
同時GCC-4.7定義在全球範圍內拉姆達,所以程序輸出
Hello from <lambda()>
可能更新的gcc更符合標準。不過,我想問一下標準是否確實指定了這個方面,或者它可以取決於實現。
更新:爲@ user5434961建議所有__FUNCTION__
-alike宏爲實現相關的,所以最好避免他們在一個符合標準的測試。因此,這裏是可以的,如果編譯器S
範圍內定義了這樣的lambda表達式否則打破了彙編編譯的例子:
#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'?否則,我認爲它總是編譯任何範圍。 – Lingxi
那麼,因爲'S :: s_field'是私有的,所以它不能從全局範圍訪問,所以代碼確實會破壞GCC-4.7上的編譯的確如此 – user3159253
是的,是的。我忽視了私人事物。 – Lingxi