提问人:Yiğit 提问时间:1/7/2021 最后编辑:Yiğit 更新时间:1/7/2021 访问量:155
在 C++ 中返回函子的正确方法
Proper way of returning a functor in C++
问:
考虑我们有一个函数,声明如下:add
int add(const int a, const int b);
如果我们要从...add
foo
std::function<int(const int, const int)> foo()
{
return add;
}
std::function<int(const int, const int)> foo()
{
return &add;
}
以上哪一项是返回函数对象的正确方法,因为两者的工作方式完全相同?
答:
4赞
Human-Compiler
1/7/2021
#1
两个代码片段是相同的(就语言而言)。
std::function
可以从任何可调用对象(无论是 lambda、指向函数的指针等)构造。在这两个示例中,您都使用函数指针构造 。std::function
在第一个示例中,表示函数的名称 -- 该函数衰减为函数指针。
add
在第二个示例中,表达式显式获取函数的地址,从而生成函数指针。
&add
没有“正确”的约定,因为每个约定都同样有效。在代码库中,最重要的是一致性和可读性;因此,我会坚持使用现有代码库使用的任何实践,或者组织编码约定中规定的任何实践。
评论
0赞
Yiğit
1/7/2021
我知道它们是一样的,但是在做这种事情时,普遍接受的惯例是什么?
1赞
Human-Compiler
1/7/2021
没有明确接受的约定(事实上,这样的问题对于 Stack-Overflow 来说是题外话,因为它是基于意见的)。不同的组织可能对公约有不同的偏好,任何此类公约可能同样有效。
0赞
Yiğit
1/7/2021
我不同意这个问题是题外话。这个特定的问题可能没有客观的答案,但对于许多其他情况,其中两个(或许多)功能相同的语法之一被认为是“最佳实践”。如果不问,我无法知道它的答案是否“无关紧要”。
1赞
Human-Compiler
1/7/2021
我可以将其添加到答案中,尽管问题的措辞并没有明确说明它询问的是约定俗成(这就是为什么我还没有添加这个)。至于它是否偏离主题:几乎任何可能基于约定的东西通常都是偏离主题的,尤其是在没有任何标准编码约定的C++中。最重要的是一致性。
1赞
Jarod42
1/7/2021
请注意,从函数到函数指针的转换继承自 C,对于成员指针,没有隐式转换,并且是必需的 (),如果它可以指导约定。&
&MyClass::foo
下一个:优化嵌套的 for 循环
评论
auto foo() -> int(&)(int, int) { return add; }
&add