Consider the following snippet:
#include <iostream>
template <int I>
constexpr int f() { return I * f<I-1>(); }
template<>
constexpr int f<0>() { return 1; }
int main () {
std::cout << f<5>();
return 0;
}
This code compiles nicely with both g++ and clang. Very nice.
Now add static
to the template function specialization:
template<>
constexpr static int f<0>() { return 1; }
then g++ 6.1 reacts with an error:
11 : error: explicit template specialization cannot have a storage class
and clang 3.8 too:
11 : error: explicit specialization has extraneous, inconsistent storage class 'static'
They look like in agreement. Very nice again.
Now, add static
keyword also the template function general case:
g++ 6.1:
11 : error: explicit template specialization cannot have a storage class
clang 3.8 compiles with a warning:
11 : warning: explicit specialization cannot have a storage class
and clang result returns the correct answer.
Is this a bug in clang? If not, in which case does it make sense not to throw an error?
It's as simple as [dcl.stc]/1 (which goes as far back as C++98):
A storage-class-specifier other than
thread_local
shall not be specified in an explicit specialization (14.7.3) or an explicit instantiation (14.7.2) directive.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With