从无效功能返回

Return from void function

本文关键字:返回 功能 无效      更新时间:2023-10-16

假设一个类存在如下:

class Foo
{
    void do_after_something()
    {
    //some code here
    return;
    }
    void do_something()
    {
    //some code here
    return do_after_something(); //returning another (void) function
    }
};

JAVA显然反对类似上述的东西,Borland C++编译器发出警告,MS VC++不抱怨。

我的问题是:从空函数返回在逻辑上(理论上)是正确的吗?
return do_after_something();

而不是:

do_after_something();
return;

还是完全依赖于实现(编译器/语言)?

从哲学上讲,你可以争辩说应该允许返回void-return函数的结果,但遗憾的是,这里的情况并非如此,至少对于Java来说是这样。

但是,它对C++有效。如果您尝试以下程序:

#include <iostream>
void xyzzy(void) {}
void plugh(void) { return xyzzy();}
int main() {
    std::cout << "Hellon";
    plugh();
    return 0;
}

它会正常工作。

这在ISO C++11 6.6.3 /3中有详细说明:

带有 void 类型表达式的 return 语句只能在返回类型为 cv void 的函数中使用;表达式在函数返回给调用者之前被计算

因此,如果你认为 Java 方式是正确的,

如果你void认为 Java 方式不是实际的类型,而是缺少某些东西,那么认为 Java 方式是正确的,这同样有效。例如,当您有:

int xyzzy(void) { return 42; }

在 C 中,您不会被迫提供正确(非)类型的参数,例如:

void plugh;
int twisty = xyzzy(plugh);

同上,C++方式也是正确的,但方式不同 - 语言就是它们。

我认为它应该被允许并被认为在所有语言中都有效。如果有一个返回类型为 void 的函数,并且返回类型为 void 的表达式的结果(例如调用另一个void函数),则已满足该约束。

在 C 中这样做被认为是没有用的(尽管我认为这可能是允许的),因为没有理由需要它。任何时候您都这样做:

return someVoidFn();

您始终可以将其转换为:

someVoidFn();
return;

并获得完全相同的效果。

但是,在C++和Java中,返回void函数确实有实际用途,这是因为这些语言具有模板和泛型。考虑这个(不是很有用的)Java类:

class NestedIdentity<T> {
  T run(int i, T value) {
    if (i == 0) return value;
    return run(i - 1);
  }
}

它的 run 方法在调用自身给定次数后返回您传递给它的值。我知道,毫无意义,对吧?但重要的是,T可能是无效的。您可以这样做:

NestedIdentity<Void> nest = new NestedIdentity<Void>();
nest(5, null);

这行得通。在 Java 中,Void(注意大写)实例化具有类似 void 类型的泛型,其唯一值是 null 。如果 Java 不允许在 void 方法中返回 void 表达式,则必须是编译时错误才能实例化具有 void 的泛型。

在 C++ 11 中,它可能且合法。您可以从其他 void 函数返回 void 函数。Rerefence The C++ Programming Language Chapter 12 , Bjarne Strousstrup