在 C++11 标准的 6.8.3 中,它说:
如果在解析过程中,模板参数中的名称与在试解析期间绑定的名称不同,则程序格式错误。
由于此要求而导致程序格式错误的程序示例是什么?
#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;
}
中的第一个声明main()
需要消除歧义,因此执行了试用解析。在此解析期间,本地w
是未知的,因为解析是纯粹的句法(仅解析事物,不执行语义动作)。因此,w
是一个全局常量,它的值为 17,x<w>::b
是一个值,z
也是一个变量。
在真正的解析过程中,会发生语义动作。因此,名称w
绑定到新声明的局部常量,其值为 42,x<w>::b
成为类型,并且z
是函数声明。