2012-05-21 77 views
4
#include <functional> 
#include <iostream> 

namespace{ 
//const std::function< void(const int) > foo[] = 
const auto foo[] = 
{ 
    [](const int v){ std::cout<<v<<std::endl; }, 
    [](const int v){ std::cout<<v/2<<std::endl; }, 
    [](const int v){ std::cout<<v/3<<std::endl; }, 
}; 

} 

int main() 
{ 
    foo[1](5); 
} 

上面的例子失敗,下一個錯誤消息來編譯(使用克++ 4.6.1)從lambda表達式推斷類型:未能在初始化列表中

error: unable to deduce 'const std::initializer_list<const auto> []' from '{{}, {}, {}}' 

的註釋行工作正常(沒有指定功能類型)。

這是g ++的怪癖嗎?或者是否有標準中的任何內容告訴上述不應該編譯?

回答

8

你不能這樣做。每個lambda具有唯一的,不相關的類型。如果你想lambda表達式的集合,你有std::function抹去類型:

std::function<void(int)> foo[] = { 
    [](int) { ... }, 
    [](int) { ... }, 
    ... 
}; 

即使在

auto f1 = []{}; 
auto f2 = []{}; 

兩種類型是不同的。

+2

'[expr.prim.lambda]/3'告訴確切的。不知道我怎麼看不見它。謝謝。 –

2

除了別人對具有獨特類型的lambdas的評論之外,您不允許在數組變量聲明中使用auto作爲說明符。甚至以下是不合格

auto x[] = { 1, 2, 3 }; // 'auto' disallowed 
+0

我知道它不能從{1,2.0,4u}中推斷出來,但是爲什麼要從所有的整數? –