C++ 从C++;

C++ 从C++;,c++,return,void,C++,Return,Void,考虑以下代码段: void Foo() { // ... } void Bar() { return Foo(); } P>在C++中使用上述的理由是什么,而不是更常见的方法: void Foo() { // ... } void Bar() { Foo(); // no more expressions -- i.e., implicit return here } 我能想到的唯一原因是如果您有一长串returnfoo()语句,并希望使其更紧凑 这是一个毫无用处

考虑以下代码段:

void Foo()
{
  // ...
}

void Bar()
{
  return Foo();
}
<> P>在C++中使用上述的理由是什么,而不是更常见的方法:

void Foo()
{
  // ...
}

void Bar()
{
  Foo();

  // no more expressions -- i.e., implicit return here
}

我能想到的唯一原因是如果您有一长串
returnfoo()语句,并希望使其更紧凑

这是一个毫无用处的构造,除非与模板一起使用。也就是说,如果您定义了返回值可能为“void”的模板函数。

在您的示例中可能没有用处,但在某些情况下,在模板代码中很难处理
void
,我希望此规则有时会有所帮助。非常做作的例子:

#include <iostream>

template <typename T>
T retval() {
    return T();
}

template <>
void retval() {
    return;
}

template <>
int retval() {
    return 23;
}

template <typename T>
T do_something() {
    std::cout << "doing something\n";
}

template <typename T>
T do_something_and_return() {
    do_something<T>();
    return retval<T>();
}

int main() {
    std::cout << do_something_and_return<int>() << "\n";
    std::cout << do_something_and_return<void*>() << "\n";
    do_something_and_return<void>();
}
#包括
模板
T retval(){
返回T();
}
模板
void retval(){
返回;
}
模板
int retval(){
返回23;
}
模板
不要做某事{

std::cout您可以在通用代码中使用它,其中Foo()的返回值未知或可能会更改。请考虑:

template<typename Foo, typename T> T Bar(Foo f) {
    return f();
}
模板T条(Foo-f){
返回f();
}
在这种情况下,Bar对void有效,但如果返回类型更改,它也有效。但是,如果它仅调用f,那么如果T为非void,则此代码将中断。使用return f();语法可以保证保留Foo()的返回值(如果存在),并允许void()

此外,显式返回是一个好习惯。

模板:

template <typename T, typename R>
R some_kind_of_wrapper(R (*func)(T), T t)
{
   /* Do something interesting to t */
   return func(t);
}

int func1(int i) { /* ... */ return i; }

void func2(const std::string& str) { /* ... */ }

int main()
{
   int i = some_kind_of_wrapper(&func1, 42);

   some_kind_of_wrapper(&func2, "Hello, World!");

   return 0;
}
模板
R某种包装器(R(*func)(T),T)
{
/*做些有趣的事给t*/
返回函数(t);
}
int func1(int i){/*…*/return i;}
void func2(const std::string&str){/*…*/}
int main()
{
int i=某种包装器(&func1,42);
某种包装(func2,“你好,世界!”);
返回0;
}

在不能返回void的情况下,
返回func(t)当模板中的
被要求包装
func2

时,模板中的
不起作用,原因是像math一样返回内存。h总是返回。math.h没有空参数和空参数。在许多实际情况下,您需要内存。

可能是
Foo()
最初返回了一个值,但后来更改为
void
,更新该值的人只是想得不太清楚。

谢谢。所有答案都很好,但这一个很好地说明了这一点。那么它就不是“无用的”了,是吗?;)@jalf:好吧,从问题中显示的形式来看,它是非常无用的,不是吗?;-)足够正确。我将问题中的代码解释为语言功能的一个示例,并询问语言功能通常何时有用。但公平点是什么?数学函数接受参数和返回值,因为它们就是这样做的需要做的是数学函数。。。