Is it an error to explicitly specialize a deleted function template? gcc and msvc seem to think it's fine, and both compile this example:
template<int i> int f() = delete;
template<> int f<4>() { return 4; }
int main() { return f<4>(); }
In contrast clang (r152210) sees an explicit specialization of a deleted function template as a redefinition:
[jwalden@wheres-wally tmp]$ ~/Programs/clang-build/build/Release/bin/clang++ -std=c++11 clang-delete-bug.cpp
clang-delete-bug.cpp:2:16: error: redefinition of 'f'
template<> int f<4>() { return 4; }
^
clang-delete-bug.cpp:2:16: note: previous definition is here
clang-delete-bug.cpp:4:21: error: call to deleted function 'f'
int main() { return f<4>(); }
^~~~
clang-delete-bug.cpp:2:16: note: candidate function [with i = 4] has been explicitly deleted
template<> int f<4>() { return 4; }
^
2 errors generated.
The N2346 default/delete proposal says that "One can define a template with a deleted definition. Specialization and argument deduction occur as they would with a regular template function, but explicit specialization is not permitted." and proposes editing 14.7.3 to allow an explicit specialization to declare only non-deleted function templates. But N3242 at least didn't make this change (I don't have the final spec), so I'm guessing this is a clang bug but don't know. Who's right?
Jeff