假设有一个类有几个数据成员,例如:
struct s {
char c;
int i;
};
如果我需要一个指向成员的 const 指针,这很简单:
auto s::* const ptr = &s::c;
如果我尝试创建相同类型的静态成员,就会开始发生一些奇怪的事情......
例如,这会导致编译器出现段错误(gcc 4.9.3):
struct s {
char c;
int i;
static auto s::* const static_ptr = &s::c;
};
// internal compiler error: Segmentation fault
// static auto s::* const static_ptr = &s::c;
// ^
将其用作不同类的静态成员至少完成编译:
struct t {
static auto s::* const static_ptr = &s::c;
};
// error: 'constexpr' needed for in-class initialization of static data member 'char s::* const t::static_ptr' of non-integral type [-fpermissive]
// static auto s::* const static_ptr = &s::c;
// ^
我不明白的最后一个错误,不是&s::c
constexpr 吗?
我确实有办法让它工作,例如:
// also works with `struct s` this way, `struct t` is not needed for this
struct t {
static char s::* const static_ptr;
};
char s::* const t::static_ptr = &s::c;
但出于几个原因,这是不可取的:
auto
只能在定义中使用,如果在类之外初始化,则必须声明类型。- 显式声明类型意味着重复类型或重复成员名称(as
decltype(s::c)
) - 保持相同名称的更多位置 = 可能出现更多错误。 - 对于专门的类模板,上述内容更加令人讨厌,对于每个专业化,这需要在类内部和外部完成。
从这里我有一个两部分的问题。
1.为什么不是&s::c
? constexpr
有没有办法让它成为一个?
2.有没有办法指定一个静态成员,它是指向另一个类成员的固定指针,类型自动确定,而不诉诸于decltype
?
我作为成员尝试过这个struct s
并得到相同的错误(需要 constexpr):
static constexpr auto s::* const member_c () {
return &s::c;
}
所以我不知道编译器对这种语法的问题是什么,这对我来说没有意义,为什么对数据成员的引用(不是实例成员引用)在编译时不是常量.