Consider the following code:
template<int* a>
class base {};
int main()
{
base<(int*)0> test;
return 0;
}
Both Comeau and MSVC compile this without issues (except for Comeau warning about an unused variable), while GCC fails on the base<(int*)0> test;
line, stating
In function `int main()': a casts to a type other than an integral or enumeration type cannot appear in a constant-expression
template argument 1 is invalid
What exactly is it complaining about? And who's right -- should this code compile? It's worth noting that my GCC version is extremely old (3.4.2) so that may have something to do with it.
From a draft standard (emphasis added):
14.1.3 A non-type template-parameter shall have one of the following (option- ally cv-qualified) types: ... --pointer to object, accepting an address constant expression desig- nating a named object with external linkage, ...
Apparently, it's not legal to instantiate a template with a null pointer, as a null pointer doesn't point to a "named object with external linkage".