为什么以下在GCC 4.8(g++
)中编译?它不是完全不合格吗?
void test(int x)
{
return test(3);
}
int main() {}
Run Code Online (Sandbox Code Playgroud)
test
不存在的调用结果test
从根本上说,两者都应该是根本不可能的 - 不仅仅是UB,我还记得 - void
返回类型.
我得到的唯一警告是关于x
未使用,甚至没有关于添加非标准隐式返回类型的任何事情.
Mat*_*Mat 11
这是标准所允许的(§6.6.3/ 3)
表达式为void的return语句只能在返回类型为cv void的函数中使用; 在函数返回其调用者之前计算表达式.
至于为什么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; });
}
Run Code Online (Sandbox Code Playgroud)
如您所见,在return语句中call
不需要做特殊情况void
.类似于x.~T()
允许的类型,即使T
最终结果为int
.
归档时间: |
|
查看次数: |
399 次 |
最近记录: |