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

これはできません。各ラムダには、関連のない一意の型があります。ラムダのコレクションが必要な場合は、次のようにして型を消去する必要がありますstd::function

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

でも

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

2つのタイプは異なります。

于 2012-05-21T08:02:18.663 に答える
2

一意の型を持つラムダについて他の人が言うことに加えてauto、配列変数宣言で指定子として使用することは許可されていません。以下でも形式が正しくありません

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