为什么以下编译在GCC 4.8(g++
)中?是不是完全不合格?
void test(int x)
{
return test(3);
}
int main() {}
test
的结果,该结果不存在test
根据void
返回类型,两者都应该根本不可能 - 不仅仅是UB,而且只有UB。
我得到的唯一警告是x
未使用,甚至没有关于添加非标准隐式返回类型的任何内容。
答案 0 :(得分:11)
标准允许(§6.6.3/ 3)
表达式为void的return语句只能用于返回类型为cv void的函数;在函数返回其调用者之前计算表达式。
答案 1 :(得分:6)
至于为什么GCC允许它 - 确定因为标准要求它有效。根据标准中规则的基本原理构建传递闭包,我很确定GCC允许这样做,因为它在模板事件中很有用
template<typename F>
typename std::result_of<F()>::type call(F f) {
return f();
}
int main() {
std::cout << call([]{ return 42; }) << std::endl;
call([]{ std::cout << "I'm just an outputtor!" << std::endl; });
}
如您所见,call
不需要在return语句中为void
执行特殊情况。类似于x.~T()
即使T
最终为int
的方式也是如此。