的C++ 11標準說(或至少,我有版本 - 不是最後一個):爲什麼隱式的「lambda轉換爲函數指針」禁止「通過引用」捕獲靜態成員?
該閉合類型與沒有λ-捕獲的λ-表達具有 公共非虛擬非顯式常量轉換函數指向 ,其功能與封閉類型的函數調用操作符具有相同的參數和返回類型。
我明白爲什麼從一個有狀態的lambda函數獲取函數指針是不可能的,因爲函數指針本身不能保存任何數據。
但是,當捕獲的對象只是一個靜態成員/靜態變量時,不存在這樣的限制,因爲捕獲的對象的引用可以在函數本身中硬連線。
struct A {
static int count = 0;
void foo() {
static int bar = 0;
auto fun = [&]()->void {
count++;
bar++;
};
void(*ptrFun)();
ptrFun = fun; // forbidden by the quoted wording
}
};
爲什麼在前者無狀態時,將lambda函數轉換爲函數指針是不可能的?我是否錯過了一些東西,或者委員會是否忘記了這一點?
我猜測這是爲了避免要求編譯器能夠證明什麼被捕獲。 – Flexo 2012-07-17 22:59:25
編譯器只要使用它們就已經能夠自動捕獲變量(使用自動[&]),所以它不會涉及更多的工作來檢查它們是靜態成員還是全局變量,因爲它們必須之前已宣佈。 – 2012-07-17 23:05:17
其實我沒有在任何編譯器上測試過它(我只有MSVC10,它根本不支持函數指針轉換)。我想這是一個GCC擴展?無論如何,我的問題是:標準允許(也許我錯過了什麼)?如果不是,爲什麼它被禁止(也許有一個我不知道的技術限制)? – 2012-07-17 23:11:09