相同类型和访问级别的字段是否连续?

时间:2019-12-10 16:44:50

标签: c++ templates recursion

假设我有一个具有两个具有相同访问级别和类型的字段的类;如果我有第一个指针pp + 1总是第二个指针吗?例如上课

class A {

public:
  B first;
  B second;

};

如果我那时有A a;B *p = &(a.first);,那么在任何情况下(p + 1) == &(a.second)可能都为假?同样适用于成员指针(例如B A::*p = &A::first(p + 1) == &A::second)吗?

更大的情况下,假设我尝试不使用内置数组来重新创建std::array。我可以尝试这样的事情:

template<class T, size_t N>
class array {

  T head;
  array<T, N - 1> rest;

public:

  // ... and all the constructors and methods and whatnot

};

template<class T>
class array<T, 1> {

  T head;

public:

  // ...

};

template<class T>
class array<T, 0> {

public:

  // ...

};

(1的特殊情况是因为sizeof(array<T, 0>)1,就像其他任何空类一样,这意味着如果将其包含在递归中,则sizeof(array<T, N>)sizeof(T) * N + 1而不是预期的sizeof(T) * N

鉴于上述类的定义,我可以安全地定义类的T& operator [](size_t index)只是为了返回*(&head + index)吗?

(我知道我可以将其定义为返回index ? rest[index - 1] : head,但是递归会带来一些巨大的开销,即使对尾调用进行了优化或内联,它仍然有效地变为index ? (index - 1 ? (index - 2 ? ... : rest.rest.head) : rest.head) : head,仍然涉及比指针算术版本多得多的跳动

注意:我不是在问是否应该这样做,但是可以吗?我不打算应用此功能,我很好奇。另外,我的问题只是关于指针算术的东西,而不是我的示例中的其他内容。

0 个答案:

没有答案