通用 lambda 的熟悉模板语法
Familiar template syntax for generic lambdas
对于 c++20,建议为通用 lambda 添加以下语法 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: error: expected primary-expression before '>' token
f("Hello");
lambda 表达式的结果不是函数;它是一个函数 object。也就是说,它是一个 class 类型,上面有一个 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);
.
对于 c++20,建议为通用 lambda 添加以下语法 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: error: expected primary-expression before '>' token f("Hello");
lambda 表达式的结果不是函数;它是一个函数 object。也就是说,它是一个 class 类型,上面有一个 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);
.