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

时间:2018-11-02 05:33:04

标签: c++ object constructor std type-parameter

我看到过的例子:

std::cout << std::plus<>{}(a, b) << '\n';在问题here中。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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的实例存在很长时间,则这很有用。