Familiar template syntax for generic lambdas(通用 lambda 的熟悉模板语法)
问题描述
对于 c++20,建议为通用 lambdas 添加以下语法 p0428r2.pdf
For c++20 it is proposed to add the following syntax for generic lambdas p0428r2.pdf
auto f = []<typename T>( T t ) {};
但是当前在 gcc 8 中的实现不接受以下实例化:
But the current implementation in gcc 8 did not accept the following instantiation:
f<std::string>("");
这是 gcc 中的实现错误还是缺少语言功能?我知道我们谈论的是提案而不是批准的规范.
Is that a implementation bug in gcc or a missing language feature? I know we talk about a proposal and not a approved specification.
完整示例(与模板函数语法比较):
Complete example ( with comparison to template function syntax ):
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: 错误:'>' 标记前的预期主表达式f("你好");
main.cpp:25:22: error: expected primary-expression before '>' token f("Hello");
推荐答案
lambda 表达式的结果不是函数;它是一个函数对象.也就是说,它是一个具有 operator()
重载的类类型.所以这个:
The result of a lambda expression is not a function; it is a function object. That is, it is a class type that has an operator()
overload on it. So this:
auto f = []<typename T>( T t ) {};
相当于:
struct unnamed
{
template<typename T>
void operator()(T t) {}
};
auto f = unnamed{};
如果你想显式地为 lambda 函数提供模板参数,你必须显式调用 operator()
:f.operator()(parameters);代码>.
If you want to explicitly provide template arguments to a lambda function, you have to call operator()
explicitly: f.operator()<template arguments>(parameters);
.
这篇关于通用 lambda 的熟悉模板语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:通用 lambda 的熟悉模板语法
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01