template <int* ip> struct test {};
struct q {
static int a;
int b;
constexpr q(int b_) : b(b_) {}
};
int i;
constexpr q q0(2);
int main()
{
constexpr test<&i> t1; // Works fine
constexpr test<&q::a> t2; // Works
constexpr test<&q0.b> t3; // Does not work; address of non-static member?
return 0;
}
在上述代码中,尽管模板参数&q0.b
在编译时已知,但是t3的声明失败。一些搜索结果表明,这在标准(第14.3.2节)中是不允许的:
[注意:数组元素的地址以及非静态类成员的名称或地址都不是可接受的模板参数。
X<&s.m> x4; // 错误:非静态成员的地址
那么为什么标准明确禁止此操作,尽管全局变量的非静态成员的地址也是唯一并且在编译时已知呢?
int*
,而应该是int q::*
,是吧? - skypjack