は、次のことを考えてみましょう:ラムダを引数として渡したテンプレート関数の関数型パラメータを推測するには?
#include <utility>
#include <string>
template<typename>
class C;
template<typename R, typename T>
class C<R(&)(T)> {
public:
template<typename F>
C(F&& fun) {}
};
template<typename T>
C<T> makeC(T&& fun) {
return C<T>(std::forward<T>(fun));
}
int foo(int a){return a;}
int main() {
auto p1 = makeC(foo); // OK
auto p2 = C<int(&)(int)>([](int a){return a;}); // OK
// auto p3 = makeC([](int a){return a;}); // FAIL
}
コンパイラがパラメータとして渡されたラムダからタイプint(&)(int)
を推測することはできませんのでp3
の宣言が失敗しました。 p1
は、タイプが明示的に宣言されているので、タイプがfoo
から容易に推測できるのでOKです。p2
はOKです。それはで失敗
:
error: invalid use of incomplete type 'class C<main()::<lambda(int)> >'
は、コンパイラがcorretly関数の型を推論させるためにどのような方法は、ラムダ与えられた、ありますか?
P .: C++ 17回答も該当する場合は大丈夫です。
http://stackoverflow.com/questions/21657627/what-is-the-type-signature-of-a-c11-1y-lambda-function – LogicStuff