首页 > 解决方案 > 这个语法 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>()明确指定对象的任何类型参数。但是,当所有这些都一起使用时,这意味着什么?我也找不到解释这一点的文章或网页,或者我可能遗漏了一些东西。它是什么?

标签: c++objectconstructorstdtype-parameter

解决方案


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

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存在很长时间。


推荐阅读