【问题标题】: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 &lt;&lt; std::plus&lt;&gt;{}(a, b) &lt;&lt; '\n';在问题here中。

std::hash&lt;T&gt;{}(54879)

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

我知道object{}object() 调用默认ctor,object{val}object(val1,val2) 调用带参数的构造函数。并且object&lt;&gt;{}object&lt;T&gt;() 明确指定对象的任何类型参数。但是,当所有这些都一起使用时,这意味着什么?我也找不到解释这一点的文章或网页,或者我可能遗漏了一些东西。这是什么?

【问题讨论】:

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


【解决方案1】:

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

template<typename T>
struct myclass {
    int operator()(int arg1, int arg2);
};

然后 sn-p x = myclass&lt;SomeType&gt;{}(val1, val2); 做了以下事情:

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

可以改为编写以下等效代码:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多