假设我有一个具有两个具有相同访问级别和类型的字段的类;如果我有第一个指针p
,p + 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
,仍然涉及比指针算术版本多得多的跳动
注意:我不是在问是否应该这样做,但是可以吗?我不打算应用此功能,我很好奇。另外,我的问题只是关于指针算术的东西,而不是我的示例中的其他内容。