C ++ 11模板参数misbind的示例?

时间:2013-04-11 06:20:32

标签: c++ templates c++11

在C ++ 11标准的6.8.3中,它说:

  

如果,   在解析期间,模板参数中的名称的绑定方式与在试验期间绑定的名称不同   解析,该程序是不正确的。

由于此要求而导致程序错误的示例是什么?

1 个答案:

答案 0 :(得分:27)

#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是函数声明。