c++ - 这个语法 std::class<>{}(arg1, arg2) 在 C++ 中的含义是什么?
问题描述
我见过的例子:
std::cout << std::plus<>{}(a, b) << '\n';
在这里的问题。
std::hash<T>{}(54879)
还有其他的,我现在找不到。
我知道object{}
orobject()
调用默认的ctor,object{val}
或者object(val1,val2)
调用带有参数的构造函数。并且object<>{}
或object<T>()
明确指定对象的任何类型参数。但是,当所有这些都一起使用时,这意味着什么?我也找不到解释这一点的文章或网页,或者我可能遗漏了一些东西。它是什么?
解决方案
您所看到的是创建一个临时函子只是为了调用它的函数调用运算符。假设该类具有函数调用运算符的重载:
template<typename T>
struct myclass {
int operator()(int arg1, int arg2);
};
然后代码片段x = myclass<SomeType>{}(val1, val2);
执行以下操作:
myclass<SomeType>
由于统一初始化程序,它通过调用默认构造函数来创建一个临时类型的对象{}
。- 然后它调用
operator()
该临时对象,在这种情况下提供val1
和val2
作为参数 - 整个表达式返回函数调用运算符的结果,临时被销毁
可以改为编写以下等效代码:
{
auto obj = myclass<SomeType>{}; // initialize object
x = obj(val1, val2); // invoke operator()
}
这很有用,例如,如果您想计算一个对象的哈希值,std::hash
但不希望一个实例std::hash
存在很长时间。
推荐阅读
- python - 不同列中出现的 Pandas/pyspark 代表性样本
- azure-devops-migration-tools - 迁移历史记录中不再存在“团队项目”引用的工作项失败
- omnet++ - 计算每条链路的丢包数和全网的总丢包数
- c# - XAML 将样式与工具包中的样式相结合
- reactjs - ThemedStyledProps 类型上不存在属性“名称”
- docker - 全局限制 docker(或 docker-compose)资源
- git - 有没有办法推送 WIP 分支并保持本地未提交的更改?
- kotlin - 创建一个回调函数,里面有另一个回调
- c - 这段代码应该简单地读取一个包含日期的文件并将它们保存在一个结构数组中,但是当我控制打印时,我得到了奇怪的结果
- java - Java JPEG 十六进制转 ASCII