рассмотреть что-то вроде этого:
#include <iostream>
struct C {
C(double x=0, double y=0): x(x) , y(y) {
std::cout << "C ctor " << x << " " <<y << " " << "\n";
}
double x, y;
};
struct B {
B(double x=0, double y=0): x(x), y(y) {}
double x, y;
};
struct A {
B b[12];
A() {
b[2] = B(2.5, 14);
b[4] = B(56.32,11.99);
}
};
int main() {
const B& b = A().b[4];
C c(b.x, b.y);
}
когда я компилирую с -O0, я получаю печать
C ctor 56.32 11.99
но когда я компилирую с -O2, я получаю
C ctor 0 0
Я знаю, что мы можем использовать ссылку const для продления локального временного файла, поэтому что-то вроде
const A& a = A();
const B& b = a.b;
было бы совершенно законно. но я изо всех сил пытаюсь найти причину, по которой тот же механизм/правило не применяется ни к какому временному
ИЗМЕНИТЬ ДЛЯ БУДУЩЕГО ИСПОЛЬЗОВАНИЯ:
Я использую gcc версии 6.3.0
clang++ prog.cc -Wall -Wextra -O2 -march=native -I/opt/wandbox/boost-1.71.0/clang-head/include -std=gnu++2a -pedantic
- person mutantkeyboard   schedule 10.09.2019[...]and seems to work fine[...]
действительно вводит в заблуждение, поскольку подразумевает, что вы считаете его действительным только потому, что он компилируется, и вы не получаете никакого сообщения об ошибке. На вопрос нельзя ответить путем тестирования, если он компилируется без каких-либо сообщений об ошибках. (за исключением случаев, когда вы знаете компилятор с настройками компилятора, которые точно не хотели бы говорить о возможном UB из-за const ref). - person t.niese   schedule 10.09.2019