2

假设有一个类有几个数据成员,例如:

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::cconstexpr 吗?

我确实有办法让它工作,例如:

// 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;

但出于几个原因,这是不可取的:

  1. auto只能在定义中使用,如果在类之外初始化,则必须声明类型。
  2. 显式声明类型意味着重复类型或重复成员名称(as decltype(s::c)) - 保持相同名称的更多位置 = 可能出现更多错误。
  3. 对于专门的类模板,上述内容更加令人讨厌,对于每个专业化,这需要在类内部和外部完成。

从这里我有一个两部分的问题。

1.为什么不是&s::c? constexpr有没有办法让它成为一个?

2.有没有办法指定一个静态成员,它是指向另一个类成员的固定指针,类型自动确定,而不诉诸于decltype

我作为成员尝试过这个struct s并得到相同的错误(需要 constexpr):

static constexpr auto s::* const member_c () {
  return &s::c;
}

所以我不知道编译器对这种语法的问题是什么,这对我来说没有意义,为什么对数据成员的引用(不是实例成员引用)在编译时不是常量.

4

0 回答 0