【问题标题】:What is the meaning of this syntax std::class<>{}(arg1, arg2) in C++?这个语法 std::class<>{}(arg1, arg2) 在 C++ 中的含义是什么?
【发布时间】:2018-11-02 05:33:03
【问题描述】:
我见过的例子:
std::cout << std::plus<>{}(a, b) << '\n';在问题here中。
std::hash<T>{}(54879)
还有其他人,我现在找不到。
我知道object{} 或object() 调用默认ctor,object{val} 或object(val1,val2) 调用带参数的构造函数。并且object<>{} 或object<T>() 明确指定对象的任何类型参数。但是,当所有这些都一起使用时,这意味着什么?我也找不到解释这一点的文章或网页,或者我可能遗漏了一些东西。这是什么?
【问题讨论】:
标签:
c++
object
constructor
std
type-parameter
【解决方案1】:
您所看到的是创建一个临时函子只是为了调用它的函数调用运算符。
假设类有函数调用操作符的重载:
template<typename T>
struct myclass {
int operator()(int arg1, int arg2);
};
然后 sn-p 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 的实例存在很长时间。