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);
}

上面的示例无法编译(使用 g++ 4.6.1)并出现下一条错误消息:

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

注释行工作正常(不指定函数类型)。

这是 g++ 的怪癖吗?或者标准中有什么东西告诉上面不应该编译?

4

2 回答 2

8

你不能这样做。每个 lambda 都有一个唯一的、不相关的类型。如果你想要一个 lambdas 的集合,你必须用 擦除类型std::function

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

即使在

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

这两种类型是不同的。

于 2012-05-21T08:02:18.663 回答
2

除了其他人所说的具有唯一类型的 lambda 之外,您不允许auto在数组变量声明中用作说明符。即使以下内容也不正确

auto x[] = { 1, 2, 3 }; // 'auto' disallowed
于 2012-05-22T19:55:32.447 回答