ゆとりーなの日記

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

テンプレート引数がラムダ式内で使えないことがあるらしい

テンプレート引数がラムダ式内で使えないことがあるみたいなのでメモしておきます。

// これはOK
template <int N>
void foo() {
  auto f = [] {return N;};
}

// Tが見つからないと怒られる@msvc10
template <typename T>
void hoo() {
  auto f = [] {return T::value;};
}

int main() {
  foo<0>();
  hoo<std::integral_constant<int, 0>>();
  return 0;
}

ラムダ式内では型引数は参照できないってことなんですかねとか思ったんですがこれだと問題ないので良くわかりません。

template <typename T>
void hoo() {
  auto f = []() -> int {T a; return a;};
}

結論としてはこれがこけるので、

// やっぱりNが見つからないと怒られる@msvc10
template <typename T>
void hoo() {
  auto f = []() -> int {typename T::type a; return a;};
}

struct hoge {
  typedef int type;
};

int main() {
  hoo<hoge>();
  return 0;
}

ラムダ式内では型引数に対して::が使えないってことになるんですかね。因みにメタ関数経由だと大丈夫みたいです。

template <typename T>
struct get_type {
  typedef typename T::type type;
};

template <typename N>
void hoo() {
  auto f = []() -> int {get_type<N>::type a; return a;};
}

というかこの場合get_type::typeってtypename不要でしたっけ。typenameを無視する事に定評のあるmsvcに於いてもこれにtypename付けるとこけます。