在 C++ 中返回仿函数的正确方法
Proper way of returning a functor in C++
假设我们有一个这样声明的 add
函数:
int add(const int a, const int b);
如果我们return这个add
函数来自foo
...
std::function<int(const int, const int)> foo()
{
return add;
}
std::function<int(const int, const int)> foo()
{
return &add;
}
以上哪一项是 return 函数对象的正确方法,因为两者的工作方式完全相同?
两个代码片段是相同的(就语言而言)。
std::function
可以从任何可调用对象(无论是 lambda、函数指针等)构造。在这两个示例中,您都使用函数指针构造 std::function
。
在第一个示例中,add
表示一个函数的名称——它会衰减为一个函数指针。
在第二个示例中,表达式&add
显式获取函数地址,生成函数指针。
没有“正确”的惯例,因为每个惯例都同样有效。代码库中最重要的是一致性和可读性;所以我会坚持现有代码库使用的任何做法,或者您组织的编码约定中规定的任何做法。
假设我们有一个这样声明的 add
函数:
int add(const int a, const int b);
如果我们return这个add
函数来自foo
...
std::function<int(const int, const int)> foo()
{
return add;
}
std::function<int(const int, const int)> foo()
{
return &add;
}
以上哪一项是 return 函数对象的正确方法,因为两者的工作方式完全相同?
两个代码片段是相同的(就语言而言)。
std::function
可以从任何可调用对象(无论是 lambda、函数指针等)构造。在这两个示例中,您都使用函数指针构造 std::function
。
在第一个示例中,
add
表示一个函数的名称——它会衰减为一个函数指针。在第二个示例中,表达式
&add
显式获取函数地址,生成函数指针。
没有“正确”的惯例,因为每个惯例都同样有效。代码库中最重要的是一致性和可读性;所以我会坚持现有代码库使用的任何做法,或者您组织的编码约定中规定的任何做法。