考虑以下计划:
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.
clang是否正确且GCC错误还是相反?请注意,如果删除delete
说明符,则clang将编译代码。
答案 0 :(得分:1)
这似乎是缺陷报告Explicit specialization of deleted function template ,正如您从here可以看到的那样,自3.9.0以来这个问题似乎已经解决了。