从 C++ 中的 void 函数返回

2022-01-19 00:00:00 return void c++

考虑以下代码段:

void Foo()
{
  // ...
}

void Bar()
{
  return Foo();
}

在 C++ 中使用上述方法而不是更常见的方法的正当理由是什么:

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
}

推荐答案

在你的例子中可能没有用,但是在模板代码中有一些情况很难处理 void,我希望这条规则有时会有所帮助.非常人为的例子:

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:

#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
";
}

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

int main() {
    std::cout << do_something_and_return<int>() << "
";
    std::cout << do_something_and_return<void*>() << "
";
    do_something_and_return<void>();
}

请注意,只有 main 必须处理在 void 情况下没有什么可以从 retval 返回的事实.中间函数 do_something_and_return 是通用的.

Note that only main has to cope with the fact that in the void case there's nothing to return from retval . The intermediate function do_something_and_return is generic.

当然,这只能让你到目前为止 - 如果 do_something_and_return 在正常情况下想要将 retval 存储在一个变量中并在返回之前对其执行一些操作,那么你仍然会遇到麻烦 - 你必须专门化(或重载)do_something_and_return 为 void.

Of course this only gets you so far - if do_something_and_return wanted, in the normal case, to store retval 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.

相关文章