Составляют ли данные члены диапазона?

Можно ли обрабатывать последовательные элементы данных того же типа, что и диапазон? Например:

struct X
{
    int a, b, c, d, e;
};

X x = {42, 13, 97, 11, 31};

std::sort(&x.a, &x.a + 5);   // kosher?

Ответы

Ответ 1

Нет, это поведение undefined. Вы рассматриваете x.a как первый элемент массива, а это не так. Может работать над некоторыми реализациями, может также совершать набег на ваш холодильник;)

Ответ 2

Не делай этого. Компилятор может свободно добавлять прокладки между элементами структуры (и в конце).

Ответ 3

Если это действительно то, что вы хотите сделать, сделайте его массивом, вектором или похожим.

Как говорили другие, стандарт не дает никаких гарантий относительно того, что члены хранятся без пробелов или в других случаях, которые вызывают проблемы. (И чтобы усугубить ситуацию, он будет работать, пока вы не скомпилируете его с другим (версией) компилятора или другой архитектурой несколько месяцев или лет спустя, и, конечно, будет нелегко понять, что пошло не так).

Ответ 4

Нет, это невозможно в С++. Было бы довольно сложно стандартизировать; в этом случае семантика достаточно проста, но что, если структура гетерогенна?

Ответ 5

Как правило, это плохая идея. Если вы хотите обрабатывать некоторые переменные как массив, вы должны объявить их как массив:)

Тем не менее вы можете использовать некоторую инструкцию для компилятора, чтобы убедиться, что между элементами нет прокладки, 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;
};