Ответ 1
Нет, это поведение undefined. Вы рассматриваете x.a
как первый элемент массива, а это не так. Может работать над некоторыми реализациями, может также совершать набег на ваш холодильник;)
Можно ли обрабатывать последовательные элементы данных того же типа, что и диапазон? Например:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
Нет, это поведение undefined. Вы рассматриваете x.a
как первый элемент массива, а это не так. Может работать над некоторыми реализациями, может также совершать набег на ваш холодильник;)
Не делай этого. Компилятор может свободно добавлять прокладки между элементами структуры (и в конце).
Если это действительно то, что вы хотите сделать, сделайте его массивом, вектором или похожим.
Как говорили другие, стандарт не дает никаких гарантий относительно того, что члены хранятся без пробелов или в других случаях, которые вызывают проблемы. (И чтобы усугубить ситуацию, он будет работать, пока вы не скомпилируете его с другим (версией) компилятора или другой архитектурой несколько месяцев или лет спустя, и, конечно, будет нелегко понять, что пошло не так).
Нет, это невозможно в С++. Было бы довольно сложно стандартизировать; в этом случае семантика достаточно проста, но что, если структура гетерогенна?
Как правило, это плохая идея. Если вы хотите обрабатывать некоторые переменные как массив, вы должны объявить их как массив:)
Тем не менее вы можете использовать некоторую инструкцию для компилятора, чтобы убедиться, что между элементами нет прокладки, f.i.:
#pragma pack(push, 1)
struct X
{
int a, b, c, d, e;
};
#pragma pack(pop)
или
struct __attribute__((__packed__)) X
{
int a, b, c, d, e;
};