次のコードを検討してください。
auto f() -> decltype(int{0.}, void()) { }
int main() { f(); }
エラーが発生して(予想どおり)コンパイルされません。
{ } 内の 'double' から 'int' への '0.0' の縮小変換
GCCとclangの両方がこれに同意しています。
次に、以下のコードを検討してください。
template <typename T>
auto f(T) -> decltype(int{0.}, void()) { }
int main(){
f(0);
}
この場合、clang 3.9 はエラーを返し、GCC 6.2 はエラーなしでコンパイルされます。
関数テンプレートの場合、縮小変換を受け入れなければならない理由はありますか、それとも GCC のエラーですか?
コンパイルに失敗するはずなので、GCC に問題を開くつもりですが、ここで関数テンプレートに関する重要な何かが欠けているかどうかを知りたいです。