問題

私はC ++テンプレートについて質問があります。次のコードsegfaults。

 template <typename T1, typename T2>
inline T1 const& max(T1 const &a, T2 const &b) {
    return a < b ? b : a;
}
int main() {
    std::cout << max(4.9, 4) << std::endl;
}
 

ただし、&を削除して正しいことを行います。

 template<typename T1, typename T2>
inline T1 const max(T1 const &a, T2 const &b) {
    return a < b ? b : a;
}
int main() {
    std::cout << max(4.9, 4) << std::endl;
}
 

さらに、T1とT2の代わりにTを使用するだけで、正常に動作します。

 template<typename T>
inline T const& max(T const &a, T const &b) {
    return a < b ? b : a;
} 

int main() {
    std::cout << max(4, 5) << std::endl;
}
 

私はここで間違って何をしていますか?

  ベストアンサー

警告をオンにしてコンパイルする必要があります。 https://wandbox.org/permlink/KkhFOJw6QNJ7rv7J を参照してください。警告フラグがオンになっている場合、コンパイラはあなたを助けて、あなたが間違っていることを教えてくれました。

ここで起こっていることはプロモーションです( Return type of '?:'(三項条件演算子))、intdoubleで三項式を実行しています。その結果、一時的にプロモートされたdoubleが得られます。一時的に参照を返し、そのライフタイムがバインドされている関数の後にそれを参照することは未定義の動作です。

  同じタグがついた質問を見る

c++templates