从无效功能返回
Return from void function
假设一个类存在如下:
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
中有详细说明:
因此,如果你认为 Java 方式是正确的,带有
。void
类型表达式的 return 语句只能在返回类型为cv void
的函数中使用;表达式在函数返回给调用者之前被计算
如果你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
- 时钟功能返回零时差
- C++链表删除和删除返回功能
- 返回状态后,功能不会结束
- C++自动功能返回?
- 确定功能主体中的返回类型
- STL查找功能从Deque返回了什么
- 返回类型不可知模板类成员功能
- 类型推论模板功能返回类型
- 使用具有返回功能的函数
- 无法从Linux,C ++执行"my_script" python脚本"main(filename)"功能;pModule = PyImport_Import(pName);返回空值
- 单位测试QT中的非返回功能
- Python C API-返回功能超载中的不同类型
- 正确施放以指向返回功能的函数的功能指针
- 自动返回功能和模板实例化
- 二次代数建议数组等返回功能
- 如何检查正确操作数以通过参考返回功能
- 字符串返回功能不起作用 - 'identifier is underfined'
- C 返回功能lock_guard
- 返回功能的使用不当
- Python的None返回功能模仿C++