成员模板专用化不使用 clang 进行编译

Member template specialization does not compile with clang

本文关键字:clang 编译 专用 成员      更新时间:2023-10-16

请考虑以下程序:

struct S {
    enum E {
        e
    };
    template<E> void f() = delete;
};
template<> void S::f<S::E::e>() {}
int main() {
    S s;
    s.f<S::E::e>();
}

GCC 5.4.0 编译代码,而 clang 3.8.0 失败:

$ clang++ -std=c++14 main.cpp 
main.cpp:10:20: error: redefinition of 'f'
template<> void S::f<S::E::e>() {
                   ^
main.cpp:8:20: note: previous definition is here
template<> void S::f<S::E::e>();
                   ^
main.cpp:14:11: error: no matching member function for call to 'f'
        s.f<S::E::e>();
        ~~^~~~~~~~~~
main.cpp:5:22: note: candidate template ignored: substitution failure [with $0 = S::E::e]
    template<E> void f() = delete;
                     ^
2 errors generated.

叮当是正确的,GCC是正确的还是相反?请注意,如果删除了delete说明符,则 clang 将编译代码。

似乎是缺陷报告 已删除函数模板的显式专用化,从这里可以看出,自 3.9.0 以来,这个问题似乎在 clang 中得到了修复。