C++ 返回带有void的函数的设计含义

C++ 返回带有void的函数的设计含义,c++,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();

考虑以下
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;
}
#包括
void foo(){

std::cout这是基于观点的。尽管我认为一般的共识是像
bar2()
那样编写。不要显式地
return
,除非你必须提前返回并且不执行
return func()
if
func()
返回一个
void
,这会让读者感到困惑,因为您实际上没有返回值。

我完全同意Sombrero Chicken的回答。但我还要补充一点,该结构类似

void bar1(){
    return foo();
}
对于返回void的普通函数没有多大意义,但对于不知道实际返回类型的模板代码可能很有用,例如:

template <typename T>
auto SomeTemplateFunction(...)
{
   // do some works
   ...
   return SomeOtherTemplateFunction<T>(...);
}
模板
自动SomeTemplateFunction(…)
{
//做一些工作
...
返回其他模板函数(…);
}

无论SomeOtherTemplateFunction的返回类型是否为void,这都会起作用。

这完全是基于观点的,我可以说的是,(3)被clangtidy规则标记为


想法是这里的控制流已经定义,返回是多余的,然后应该删除。

我理解“为什么”的问题是基于观点的。这就是为什么我问哪些范例可能对这个主题有任何意见。大概他们有一些我们可以客观衡量的理由。返回在一个
void
函数中,我立即对它产生怀疑。我说,像Pascal的程序一样对待
void
函数。我肯定会使用数字2,因为1是误导性的,当阅读正文时,我假设返回某个东西,但函数实际上是无效的,而且数字3明确表示我们正在返回,但没有返回ee任何附加值,因为它位于函数体的末尾。我不会说
bar3
是普遍好的,但有时一个明确的返回远不止是从末尾流出。Kate Gregory将这一点融入了她的讨论中。你可以从谈话中得到很多关于这些问题的思考,我强烈推荐它。兴趣ting talk.23:46是你正在谈论的时间标记。她给出了一个有趣的例子。写这样的东西的一个明显优势是我可以很容易地改变代码结构的工作方式。代价是模糊性…阅读代码,不清楚将返回什么。是的,不一定要返回,但对于非模板代码如果你的返回值是空的,我宁愿不要在函数的末尾写返回语句。对于模板代码,有时必须这样做。