根据C ++标准函数,不返回值会产生未定义的行为。对于我们没有构造函数的C来说这是合理的,但这就是为什么在C ++ 11/14/17中没有修复它?
我认为如果在执行期间没有返回语句,则默认构造返回值是很自然的。它将使代码更清晰,更安全,而不会破坏与旧C ++和C代码的兼容性。
比较
optional<int> foo() try {
return some_complex_computation();
} catch (err1& e) {
LOG << e;
return none;
} catch (err2& e) {
LOG << e;
return none;
} catch (err3& e) {
LOG << e;
// oops, undefined behaviour
}
只是
optional<int> foo() try {
return some_complex_computation();
} catch (err1& e) {
LOG << e;
} catch (err2& e) {
LOG << e;
} catch (err3& e) {
LOG << e;
}
答案 0 :(得分:3)
返回默认构造的值可能比未定义的行为更好,但它比当前的事态更糟糕,这是大多数编译器在非void函数的右大括号时发出的警告(或者是可达的。
在编译时捕获错误总是最好的,并且当前规则为编译器开发人员提供了灵活性。通过添加default-return,您可以模糊良好代码和错误代码之间的界限。
我建议你阅读Raymond Chen的博客文章,他在那里讨论了正确的代码是不够的,你需要能够告诉检查是否正确。而他并不是唯一的,其他知名专家也说同样的话。