2015-11-13 42 views
-2

根據C++標準函數不返回值產生未定義的行爲。對於沒有構造函數的C來說,這是合理的,但這就是爲什麼C++ 11/14/17中沒有解決這個問題?爲什麼C++在未指定return語句時未默認構造返回值?

如果在執行過程中沒有返回語句,我認爲默認構造返回值是很自然的。它將使代碼更清潔和更安全,而不會破壞與舊的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; 
} 
+4

有多難鍵入'返回{};'你需要一個語言功能? – Barry

+1

任何體面的編譯器都會對此發出警告,調高警告級別和/或實際開始讀取警告。 – Praetorian

+0

男人,我真的很討厭看着別人的代碼,用長長的函數來填充返回語句:( –

回答

3

返回一個默認構造的價值可能比未定義行爲更好,但它比事務的當前狀態,這是大多數編譯器更糟當無效函數的大括號是(或可能)可達時警告。

在編譯時捕獲錯誤總是最好的,而現行規則爲編譯器開發人員提供了靈活性。通過添加默認返回,您可以模擬好代碼和錯誤代碼之間的界限。

我建議你閱讀雷蒙德陳的博客文章,他討論的是正確的代碼是不夠的,你需要能夠告訴檢查是正確的。而且他不是唯一的,其他知名專家也這樣說。

+0

我可以看到'默認返回;'的語句對於有很多錯誤(或「無值」的地方)返回的代碼是有用的,並且只有一個小返回數據的地方的數量,但你肯定會想要一個特定的語句來調用它,否則,在編譯時經常不會檢測到意外省略的'return' 。 –

相關問題