返回void的设计含义

时间:2019-04-10 09:22:52

标签: c++

考虑以下bar函数

#include <iostream>

void foo(){
    std::cout << "Hello" << std::endl;
}
void bar1(){
    return foo();
}
void bar2(){
    foo();
}
void bar3(){
    foo();
    return;
}
int main()
{
    bar1();
    bar2();
    bar3();
    return 1;
}

这些函数执行完全相同的操作,实际上Godbolt为这三个函数生成相同的代码(正如人们希望的那样)。我的问题很简单,就是是否有任何软件工程范式/准则主张一种形式优于另一种形式,以及是否有任何理由使您偏爱一种形式。它们似乎产生相同的机器代码,但我正在想象一个人可能被视为“更易于维护”或类似的东西。

3 个答案:

答案 0 :(得分:4)

这是非常基于意见的。尽管我会说普遍的共识是像bar2()这样写。除非您必须早点返回,否则不要明确return,如果return func()返回func()则不要void,这只会使读者感到困惑,因为您实际上并未返回一个值。

答案 1 :(得分:1)

我完全同意Sombrero Chicken的回答。但是我还要补充一点,像

void bar1(){
    return foo();
}

对于返回void的普通函数没有多大意义,但是当您不知道实际的返回类型时,对于模板代码可能有用,例如:

template <typename T>
auto SomeTemplateFunction(...)
{
   // do some works
   ...
   return SomeOtherTemplateFunction<T>(...);
}

无论SomeOtherTemplateFunction<T>的返回类型是否为空,这都将起作用。

答案 2 :(得分:1)

这是基于观点的,我可以说的是(3)被clang-tidy规则标记为readibility-redundant-control-flow的一部分。

想法是此处的控制流已经定义,return是多余的,应将其删除。