Когда я реализовывал программу, я обнаружил, что моя программа ведет себя по-разному при переключении с -g
на -O2
в g ++ или clang ++.
Упрощенный код:
#include <cstdint>
#include <iostream>
class A {
public:
explicit A(const int64_t &zero_);
const int64_t& zero;
};
A::A(const int64_t &zero_):
zero(zero_) {
std::cout << "zero=" << zero << std::endl;
}
int main() {
A st(0);
size_t p;
std::cin >> p;
std::cout << "zero=" << st.zero << std::endl;
}
Предположим, что стандартный ввод равен 1, а исключенный вывод (в последней строке) равен нулю = 0, поскольку переменная zero
является константной ссылкой.
При компиляции с g++ -g -o b.o b.cc
программа ведет себя нормально.
Однако при компиляции с g++ -O2 -o b.o b.cc
вывод будет zero=1
Фактически, он выводит значение p
.
Это ошибка или ожидаемое поведение?
протестировано на Debian10 amd64