Example of C++11 template parameter misbind?
c++, c++11, templates
Solution
#include <iostream>
#include <typeinfo>
typedef const int cint;
template <int a> struct x
{
static cint b = 0;
};
template <> struct x<42>
{
typedef cint b;
};
cint w = 17;
int main ()
{
cint (w)(42), (z)(x<w>::b);
std::cout << typeid(z).name() << std::endl;
}
The first declaration in `main()` needs to be disambiguated, so a trial parse is performed. During this parse, the local `w` is unknown, since the parse is purely syntactic (things are only parsed, no semantic actions are performed). Consequently, `w` is a global constant, its value is 17, `x<w>::b` is a value, and `z` is a variable.
During the real parse, semantic actions take place. Thus the name `w` is bound to the freshly declared local constant, its value is 42, `x<w>::b` becomes a type, and `z` is a function declaration.
Problem
In 6.8.3 of the C++11 standard it says: If, during parsing, a name in a template parameter is bound differently than it would be bound during a trial parse, the program is ill-formed. What is an example of a program that is ill-formed as a result of this requirement?