7

次のコードを検討してください。

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 に問題を開くつもりですが、ここで関数テンプレートに関する重要な何かが欠けているかどうかを知りたいです。

4

0 に答える 0