g++の関数でreturnを省略してもコンパイラは通るが返り値は不定
タイトル通り. 従って以下のようなfunc2も普通に実行される.
#include <iostream> template <typename T_> T_ func1(const T_& x) { return x * 2; } template <typename T_> T_ func2(const T_& x) { // return func1(2 * x); func1(2 * x); } int main(void) { std::cout << "func1 -> " << func1(2) << std::endl; std::cout << "func2 -> " << func2(2) << std::endl; }
しかも, このコード手元のg++ではちゃんと機能した. いやいや, してもらっては困る. 僕のケースでは返り値がもう少し複雑だったからか, コンパイラが違うせいか, おかしな値になっており, 半日無駄にした. 気がつけよ, 俺.
http://d.hatena.ne.jp/n7shi/20110220/1298261207
http://emoken.net/blog2/category_11/item_4962.html
上の記事にそれらしき理由(C言語での元々の言語設計)が書いてありますが, 誰が聞いたっておかしいものはおかしいです. まあ, これまでこういったミスをしてこなかった僕偉い. というか, ちゃんとオプションつけておけば警告出るっぽいです.