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言語での元々の言語設計)が書いてありますが, 誰が聞いたっておかしいものはおかしいです. まあ, これまでこういったミスをしてこなかった僕偉い. というか, ちゃんとオプションつけておけば警告出るっぽいです.