Я написал этот код, который на первый взгляд показался мне очень простым. Он изменяет переменную, на которую ссылается ссылочная переменная, а затем возвращает значение ссылки. Упрощенная версия, которая воспроизводит странное поведение, выглядит так:
#include <iostream>
using std::cout;
struct A {
int a;
int& b;
A(int x) : a(x), b(a) {}
A(const A& other) : a(other.a), b(a) {}
A() : a(0), b(a) {}
};
int foo(A a) {
a.a *= a.b;
return a.b;
}
int main() {
A a(3);
cout << foo(a) << '\n';
return 0;
}
Однако, когда она скомпилирована с включенной оптимизацией (g ++ 7.5), она выдает вывод, отличный от неоптимизированного кода (т.е. 9 без оптимизаций - как ожидалось и 3 с включенной оптимизацией).
Мне известно ключевое слово volatile
, которое не позволяет компилятору переупорядочивать и другие оптимизации при наличии определенных побочных эффектов ( например, asyn c выполнение и аппаратно-зависимые c вещи), и это помогает и в этом случае.
Однако я не понимаю, почему мне нужно объявлять ссылку b как изменчивую в этом конкретном случае ? Где источник ошибки в этом коде?