C++ 中此语法 std::class<>{}(arg1, arg2) 的含义是什么?
What is the meaning of this syntax std::class<>{}(arg1, arg2) in C++?
我见过的例子:
std::cout << std::plus<>{}(a, b) << '\n';
问题中 .
std::hash<T>{}(54879)
还有其他人,我现在找不到。
我知道object{}
或object()
调用默认的ctor,而object{val}
或object(val1,val2)
调用带参数的构造函数。 object<>{}
或 object<T>()
明确指定对象的任何类型参数。但是,当所有这些一起使用时,这意味着什么?我也找不到解释这一点的文章或网页,或者我可能遗漏了一些东西。这是什么?
您所看到的是创建一个临时仿函数来调用它的函数调用运算符。
假设 class 重载了函数调用运算符:
template<typename T>
struct myclass {
int operator()(int arg1, int arg2);
};
然后代码段 x = myclass<SomeType>{}(val1, val2);
执行以下操作:
- 由于统一初始值设定项
{}
. ,它通过调用默认构造函数创建类型 myclass<SomeType>
的临时对象
- 然后在该临时对象上调用
operator()
,在本例中提供 val1
和 val2
作为参数
- 整个表达式returns函数调用运算符的结果和临时被销毁
可以改为编写以下等效代码:
{
auto obj = myclass<SomeType>{}; // initialize object
x = obj(val1, val2); // invoke operator()
}
这很有用,例如,如果您想使用 std::hash
计算对象的哈希值但不希望 std::hash
的实例长期存在。
我见过的例子:
std::cout << std::plus<>{}(a, b) << '\n';
问题中
std::hash<T>{}(54879)
还有其他人,我现在找不到。
我知道object{}
或object()
调用默认的ctor,而object{val}
或object(val1,val2)
调用带参数的构造函数。 object<>{}
或 object<T>()
明确指定对象的任何类型参数。但是,当所有这些一起使用时,这意味着什么?我也找不到解释这一点的文章或网页,或者我可能遗漏了一些东西。这是什么?
您所看到的是创建一个临时仿函数来调用它的函数调用运算符。 假设 class 重载了函数调用运算符:
template<typename T>
struct myclass {
int operator()(int arg1, int arg2);
};
然后代码段 x = myclass<SomeType>{}(val1, val2);
执行以下操作:
- 由于统一初始值设定项
{}
. ,它通过调用默认构造函数创建类型 - 然后在该临时对象上调用
operator()
,在本例中提供val1
和val2
作为参数 - 整个表达式returns函数调用运算符的结果和临时被销毁
myclass<SomeType>
的临时对象
可以改为编写以下等效代码:
{
auto obj = myclass<SomeType>{}; // initialize object
x = obj(val1, val2); // invoke operator()
}
这很有用,例如,如果您想使用 std::hash
计算对象的哈希值但不希望 std::hash
的实例长期存在。