为什么以下在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 次 |
| 最近记录: |