c++ 11模板参数misbind示例

Example of C++11 template parameter misbind?

本文关键字:misbind 示例 参数 c++      更新时间:2023-10-16

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