C ++中此语法std :: class <> {}(arg1,arg2)的含义是什么?

Nik*_*kos 2 c++ constructor object std type-parameter

我看到过的例子:

std::cout << std::plus<>{}(a, b) << '\n';这里的问题。

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

和其他人,我现在找不到它们。

我知道object{}object()调用默认的ctor,object{val}object(val1,val2)调用带参数的构造函数。和object<>{}object<T>()显式指定对象的任何类型参数。但是,当所有这些一起使用时,这意味着什么呢?我也找不到说明此问题的文章或网页,否则我可能会遗漏某些东西。它是什么?

alt*_*gel 5

您将看到只是创建一个临时函子来调用其函数调用运算符。假设该类具有函数调用运算符的重载:

template<typename T>
struct myclass {
    int operator()(int arg1, int arg2);
};
Run Code Online (Sandbox Code Playgroud)

然后,该代码段x = myclass<SomeType>{}(val1, val2);执行以下操作:

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

相反,可以编写以下等效代码:

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

例如,如果您要使用计算对象的哈希值,std::hash但又不想让它的实例std::hash存在很长时间,则此功能很有用。