看起来像plus()的预定义函子应该适用于字符串,因为它转而使用operator +。但是,这无法编译。
string one="one", two="two";
string result=std::plus<string>(one,two);
为什么?
答案 0 :(得分:1)
std::plus
是一个功能对象,必须以与使用其他功能对象相同的方式使用。
最小示例:
#include <iostream>
#include <string>
#include <functional>
int main()
{
std::string one="one";
std::string two="two";
std::string result=std::plus<std::string>()("one","two"); //a temp function object created.
std::cout << result;
}
请参见demo here。
答案 1 :(得分:1)
std::plus
是一个函子,这意味着您需要创建一个对象:
auto adder = std::plus<>{};
auto result = adder(one, two); // result is onetwo
由于这个原因,您永远不会像现在这样使用它:您总是只写one + two
。
但这确实意味着您可以像使用std::greater
之类的方式使用此方法:将其作为函子传递给适用于某些容器的函子,而无需编写自己的lambda到一起添加东西。
有关函子的更多信息,请参见What are C++ functors and their uses?。