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

问题描述 投票:0回答:1

请考虑以下代码:

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::i
pi
是一个
constexpr
变量。为什么我不能将它用作模板参数,即使直接使用
&AA::i
也可以?

c++ templates c++11 constexpr
1个回答
7
投票

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

&AA::i
语法。

这在最新草案中发生了变化,现在对任何类型的要求只是“转换后的常量表达式 模板参数的类型”,在该类型下您的代码就可以了。

我不知道此更改是否在 C++14 中,因为我还无法访问该已发布的标准。

© www.soinside.com 2019 - 2024. All rights reserved.