对于c ++ 20,建议为通用lambdas p0428r2.pdf添加以下语法
auto f = []<typename T>( T t ) {};
但是gcc 8中的当前实现不接受以下实例化:
f<std::string>("");
这是gcc中的实现错误还是缺少语言功能?我知道我们谈的是提案,而不是批准的规范。
完整示例(与模板函数语法比较):
template <typename T> void n( T t ) { std::cout << t << std::endl; }
auto f = []<typename T>( T t ) { std::cout << t << std::endl; };
int main()
{
f<std::string>("Hello"); // error!
n<std::string>("World");
}
抱怨以下错误:
main.cpp:25:22:错误:在'&gt;'之前预期的primary-expression代币 F( “你好”);
答案 0 :(得分:7)
lambda表达式的结果不是函数;它是一个函数 object 。也就是说,它是一种具有operator()
重载的类类型。所以这个:
auto f = []<typename T>( T t ) {};
等同于:
struct unnamed
{
template<typename T>
void operator()(T t) {}
};
auto f = unnamed{};
如果要为lambda函数显式提供模板参数,则必须明确调用operator()
:f.operator()<template arguments>(parameters);
。