1

I know about generic lambdas, and I know about variable templates, but, what does this do? Is it even allowed?

template<typename T>
auto f = [](auto a, T b){ /**/ };

If it's allowed, can it be used as expected? That is, as f<type>(var_a, var_b)?

max66
  • 63,246
  • 10
  • 70
  • 107
LB--
  • 2,096
  • 1
  • 36
  • 75

2 Answers2

6

A variable template must be declared constexpr. A lambda cannot occur in a constant-expression, so the initialisation is not allowed, and its operator() is not declared constexpr, so calling it isn't allowed.

In summary, this is ill-formed in the current C++14 draft.

Note: curiously, even though a lambda-expression cannot occur in a constant-expression, it seems that the closure type of a lambda may have a constexpr copy/move constructor.

Simple
  • 13,384
  • 2
  • 41
  • 46
1

This code is legal in the current draft of C++14 now and it compiles fine with clang 3.5 trunk