使用函数返回值时,以下代码在g ++中编译并工作。有一个返回void的方法,该方法在return语句中调用另一个返回void的函数。我的问题是为什么g ++允许这种行为?
#include <iostream>
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Boo()
{
return ( Foo() );
}
int main()
{
Boo();
return ( 0 );
}
答案 0 :(得分:2)
根据CPP Reference,在调用return expression;
时:
在返回类型为(可能是cv限定)void的函数中,表达式是可选的,而在构造函数和析构函数中则不允许使用
。
后来,他们指出:
在返回void的函数中,如果表达式类型为void,则可以使用带有expression的return语句。
return
可以具有void函数的表达式,只要该表达式也为void,这就是您所做的。这在模板中很有用,因为模板在编写函数时可能不知道函数的返回类型。
答案 1 :(得分:1)
void
是在某些情况下可以与其他类型互换使用的类型。如果Boo
和Foo
返回int
,那么您的示例将很有意义;为什么更改类型应该是特殊的例外,否则可以纠正语义?
return (Foo())
本质上是在说“什么也不返回”,实际上,这是Boo
规定的返回类型。你会发现
void bar() {
return void();
}
编译就可以了。