这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?

What is the meaning of this syntax std::class<>{}(arg1, arg2) in C++?

本文关键字:arg2 C++ 意思 arg1 是什么 std 语法 class lt gt      更新时间:2023-10-16

我见过的例子:

此处问题中的std::cout << std::plus<>{}(a, b) << 'n';

std::hash<T>{}(54879)

还有其他人,我现在找不到他们。

我知道object{}object()调用默认的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);执行以下操作:

  1. 它通过调用统一初始化器{}的默认构造函数来创建myclass<SomeType>类型的临时对象
  2. 然后,它在该临时对象上调用operator(),在本例中提供val1val2作为参数
  3. 整个表达式返回函数调用运算符的结果,临时表达式被销毁

可以编写以下等效代码:

{
auto obj = myclass<SomeType>{}; // initialize object
x = obj(val1, val2); // invoke operator()
}

例如,如果您希望使用std::hash计算对象的哈希,但不希望std::hash的实例存在很长时间,那么这将非常有用。