为什么C ++在没有指定return语句时没有默认构造返回值?

时间:2015-11-13 16:49:27

标签: c++ c++11

根据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;
}

1 个答案:

答案 0 :(得分:3)

返回默认构造的值可能比未定义的行为更好,但它比当前的事态更糟糕,这是大多数编译器在非void函数的右大括号时发出的警告(或者是可达的。

在编译时捕获错误总是最好的,并且当前规则为编译器开发人员提供了灵活性。通过添加default-return,您可以模糊良好代码和错误代码之间的界限。

我建议你阅读Raymond Chen的博客文章,他在那里讨论了正确的代码是不够的,你需要能够告诉检查是否正确。而他并不是唯一的,其他知名专家也说同样的话。