c++ - 通用 lambda 的熟悉模板语法
问题描述
对于 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: 错误:'>' 标记 f("Hello") 之前的预期主表达式;
解决方案
lambda 表达式的结果不是函数;它是一个函数对象。也就是说,它是一个有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++ - C++20 模块实现分区的 hpp/cpp 拆分
- ruby-on-rails - 我应该把 entrypoint.sh 文件 Rails App for Docker 放在哪里?
- node.js - 如何在 Sequelize 函数中添加 where 子句?
- c# - 使用 Google.Apis.Auth 会导致 .Net 项目中的唯一异常
- powershell - Azure AD - 无法设置类型为“Sign”的应用程序注册密钥凭据
- regex - 使用正则表达式在连接的 id 中搜索
- python - 将数据框转换为特定的 JSON
- c++ - 删除嵌套 xml 中的节点会从 QDomNodeList 中删除节点,但是在保存文件时,没有任何变化
- laravel - HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne”
- eclipse - https://download.eclipse.org/releases/2021-09 的镜像是否存在?