Внутри массива разрешена арифметика указателя (пока результат не выходит за границы, где конечная граница находится за концом массива).
// Legit
int m[3] = {0, 1, 2};
int const *p = m;
std::cout << *p << *(p + 1) << *(p + 2) << std::endl;
Разрешает ли стандарт подобную арифметику указателя со стандартной структурой макета, которая содержит последовательные переменные-члены одного и того же фундаментального типа?
// Well defined???
struct MyStruct {
int a, b, c;
};
static_assert(std::is_standard_layout_v<MyStruct>);
MyStruct m = {0, 1, 2};
int const *p = &m.a;
std::cout << *p << *(p + 1) << *(p + 2) << std::endl;
Я, конечно, могу сравнивать указатели на отдельные переменные (т. е. &m.a < &m.b
), потому что они являются членами одного и того же объекта, но я не могу определить, гарантированно ли &m.a+1
будет &m.b
.
Я знаю, что это, вероятно, будет работать с большинством компиляторов, но мне любопытно, что говорит стандарт (C++ 20, если это имеет значение).
m.a
иm.b
- это разные объекты. Однако вы можете использоватьstd::less
для сравнения указателей, а не встроенныйoperator<
- person Richard Critten   schedule 24.06.2021union
в структуру... или использовалиpragma pack
, изменился бы ответ? - person Matt   schedule 24.06.2021