为什么我不能在 C++11 中使用 constexpr 指针作为模板参数?
Why can't I use a constexpr pointer as template parameter in 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
}
我有成员指针 pi
指向 AA::i
。
pi
是一个 constexpr
变量。为什么我不能将它用作模板参数,即使直接使用 &AA::i
也可以?
因为这些是规则,至少在 C++11 中是这样; 14.3.2/1 只允许 "a pointer to member expressed as described in 5.3.1",它描述了 &AA::i
语法。
这在 latest draft 中已更改,现在对任何类型的要求只是“转换后的常量表达式
模板参数的类型”,您的代码在该类型下就可以了。
我不知道此更改是否在 C++14 中,因为我还无法访问该已发布的标准。
请考虑以下代码:
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++11 中是这样; 14.3.2/1 只允许 "a pointer to member expressed as described in 5.3.1",它描述了 &AA::i
语法。
这在 latest draft 中已更改,现在对任何类型的要求只是“转换后的常量表达式 模板参数的类型”,您的代码在该类型下就可以了。
我不知道此更改是否在 C++14 中,因为我还无法访问该已发布的标准。