ゆとりーなの日記

日記的な事を書いて行くと思はれる

これがコンパイルエラーになるのはなぜ?

LuaC++でメタメタして扱いやすくしたライブラリにluabindというのがあります。こいつを使えばLuaC++の関数オブジェクトを扱わせることも簡単に出来るわけですね。

struct hoge_functor {
  hoge_functor() {}

  void operator ()() const {} 
};

void foo() {
  luabind::module(lua_.get()) [
    luabind::def("hoge_functor", luabind::tag_function<void ()>(hoge_functor()))
  ];
}

ラムダ式もいけるのかしらと試してみたらこれは大丈夫でした。

void foo() {
  luabind::module(lua_.get()) [
    luabind::def("hoge_functor", luabind::tag_function<void ()>([] {}))
  ];
}

ところがラムダ式の中に何か書くといきなり駄目でコンパイルにこけます。

void foo() {
  luabind::module(lua_.get()) [
    luabind::def("hoge_functor", luabind::tag_function<void ()>([] {1 + 1;}))
  ];
}

因みにこれだとコンパイルが通るのです。

void foo() {
  auto temp = luabind::tag_function<void ()>([] {1 + 1;});
  luabind::module(lua_.get()) [
    luabind::def("hoge_functor", temp)
  ];
}

先のコンパイルにこける例では

左側の 角かっこ '[' が ...(..)' にありますが正しく対応していません

というエラーを吐くのでどうも構文解析に失敗している様に見えるのですが、この挙動は果たしてコンパイラのバグなのかどうがが気になるところです。
追記:
g++4.5.1のC++0xモードではコンパイルが通ったのでVC++側のバグ説が濃厚になってきた感じがします。