1

Тема: Оператор []

Читаю код, написаний одним генієм. В ньому є щось типу отакого:

Прихований текст
#include <iostream>
using namespace std;

struct A{
    float a, b, c;
    A(float _a, float _b, float _c):a(_a),b(_b),c(_c){}
    float& operator [](size_t i){
        return (&a)[i];
    }
    };



int main() {
    // your code goes here
    A a(1.0,2.0,3.0);
    cout<<a[2];    //3.0
    return 0;
}

Працює правильно, як зокрема цей код, так і в проекті. Але чи є гарантія, що одного разу пам'ять не виділиться якось інакше і все не піде коту під хвіст?

Подякували: 221VOLT1

2

Re: Оператор []

Ні, не зобов'язаний. Хоча на всіх знайомих мені архітектурах має спрацювати, в деяких випадках компілятор має право додати зайві байти в структуру (зокрема для вирівнювання по параграфах/сторінках пам'яті).
У M$ є така фішка, як  __declspec(align(...)), щоб гарантувати розміщення.
В С++ з'явився оператор alignof.
Але якщо хочете гарантувати, що спрацює - то додайте масив float-ів в union-і з a,b,c, порівнюйте розміри і якщо буде розходження - видавайте #error.

Подякували: quez1

3

Re: Оператор []

Я б його взагалі через switch писав би - і очевидніше, і якщо хтось чомусь змінить порядок оголошення змінних, то нічого не зміниться в клієнтському коді.