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

Zhi*_*ANG 6 c++ templates constexpr c++11

请考虑以下代码:

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
}
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 7

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

这在最新的草案中有所改变,现在对任何类型的要求只是"模板参数类型的转换常量表达式",在这种情况下你的代码就可以了.

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

  • 也就是说,我对这两者进行了比较,实际上这个改变仅在*C++ 14之后应用*. (2认同)