3

以下に、C++ 関数テンプレートのオーバーロード解決の非常に基本的な例をいくつか示します (実際のコードから最小化)。

struct S {
    S() {}
    S(int) {}
};

template <typename T = S>
void foo(T x) { std::cout << "S" << std::endl; }

template <>
void foo<S>(S x) { std::cout << "S spc" << std::endl; }

int main() {
    foo({});
    foo(0);
}

ここでは 2 つのケースがあります。最初のケースでは、コンパイラは何か (S など) をデフォルトで初期化し、2 番目のケースでは int を何か (S など) に変換します。

Godbolt での実例

どちらの場合も、特殊化は完全に一致し、部分的な順序付け [temp.deduct.partial] によってプライマリ テンプレートよりも実際に特殊化されているため、特殊化はオーバーロードに勝つと信じています。

しかし、この例のclang 11とgcc 10.2の両方が、2番目のケースではプライマリテンプレートが勝つことに同意しています. このバグは両方のコンパイラにあるのでしょうか、それとも (おそらく) C++ 標準について理解していないのでしょうか?

4

1 に答える 1