为什么我不能在c ++ 11中使用constexpr指针作为模板参数?

时间:2015-04-10 08:38:38

标签: c++ templates c++11 constexpr

请考虑以下代码:

template <typename T, typename P, T P:: *s> struct H {};

struct AA { int i; };

int main()
{
  typedef int AA::*PI;
  constexpr PI pi = &AA::i;

  H<int, AA, &AA::i> h1;    // OK
  // H<int, AA, pi> h2;     // compile error
}

我有成员指针pi指向AA::ipiconstexpr变量。为什么我不能将它用作模板参数,即使直接使用&AA::i也可以使用?

1 个答案:

答案 0 :(得分:7)

因为这些是规则,至少在C ++ 11中是这样; 14.3.2 / 1只允许“指向成员的指针,如5.3.1所述”,它描述了&AA::i语法。

这在latest draft中发生了变化,现在对任何类型的要求都只是“转换后的常量表达式” 模板参数的类型“,您的代码可以正常使用。

我不知道这个改变是否在C ++ 14中,因为我还没有访问该已发布的标准。