8

以下のことができればよかったです。

template <class RT, class... PT>
class Event 
{
    ...
    void operator()(PT... args)
    {
        std::for_each(
            l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); }
        );
    }
    ...
};

残念ながら、g++ 4.7.2 (-std=c++0x) でコンパイルできませんでした:

evtempl.hh: メンバー関数 'void elt::Event::operator()(PT ...)': evtempl.hh:75:54: エラー: '...' トークン evtempl.hh の前に ',' が必要です:75:54: エラー: '...' トークンの前に予期される識別子evtempl.hh: ラムダ関数内: evtempl.hh:76:26: エラー: 展開パターン 'args' に引数パックが含まれていません evtempl.hh: 'void elt::Event::operator()(PT ... のインスタンス化内) ) [RT = 無効; PT = {int}]': testevtempl.cc:28:9: ここから必要です evtempl.hh:74:9: エラー: 無効なフィールドを使用しています 'elt::Event::operator()(PT ...):: ::Handler*)>::__args' evtempl.hh: 'void elt::Event::operator()(PT ...) のインスタンス化 [with RT = void; PT = {int, const char*}]'

代わりに、そのラムダを古い平凡な構文に変更する必要があります。

for (itr = l.begin(); itr != l.end(); ++itr)
     (*(*itr))(args...);

これはコンパイルして正常に動作します。

なぜラムダ構文が機能しないのだろうか。

  1. 私は何か間違ったことをしたか、何かを見逃しましたか?
  2. そのようなことはc ++ 11標準で禁止されていますか?
  3. または、これは標準で許可されていますが、現在のコンパイラの問題ですか?

私は試した

[=](Handler *p) { (*p)(args...); }

次の場合と同じエラーが発生します。

[args](Handler *p) { (*p)(args...); }

パラメータパックが展開されていないと不平を言う

4

1 に答える 1

7

これはgccのバグです。[c ++ 0x]ラムダと可変個引数テンプレートが一緒に機能しないか、おそらく[C++11]ラムダ式でパック拡張が失敗するを参照してください。

于 2013-01-16T22:23:21.880 に答える