Consider the following snippet:
void Foo()
{
// ...
}
void Bar()
{
return Foo();
}
What is a legitimate reason to use the above in C++ as opposed to the more common approach:
void Foo()
{
// ...
}
void Bar()
{
Foo();
// no more expressions -- i.e., implicit return here
}
Templates:
Without being able to return void, the
return func(t)
in the template would not work when it was asked to wrapfunc2
.The only reason I can think of is if you had a long list of
return Foo();
statements in a switch and wanted to make it more compact.Probably no use in your example, but there are some situations where it's difficult to deal with
void
in template code, and I expect this rule helps with that sometimes. Very contrived example:Note that only
main
has to cope with the fact that in thevoid
case there's nothing to return fromretval
. The intermediate functiondo_something_and_return
is generic.Of course this only gets you so far - if
do_something_and_return
wanted, in the normal case, to storeretval
in a variable and do something with it before returning, then you'd still be in trouble - you'd have to specialize (or overload)do_something_and_return
for void.This is a rather useless construction that serves no purpose, unless it is used with templates. That is, if you have defined template functions that returns a value that may be 'void'.
You would use it in generic code, where the return value of Foo() is unknown or subject to change. Consider:
In this case, Bar is valid for void, but is also valid should the return type change. However, if it merely called f, then this code would break if T was non-void. Using the return f(); syntax guarantees preservation of the return value of Foo() if one exists, AND allows for void().
In addition, explicitly returning is a good habit to get into.
The reason is returning memory like math.h always returns. math.h has no void and no empty arguments. There are many practical situations where you need memory.