Допустим, у нас есть структура с указателем на член, который условно указывает либо на внутренний массив, либо на место в куче, например:
struct Ex {
char* p;
char data[14];
bool is_heap;
Ex() : p(&data[0]), data(), is_heap(false) {}
//etc...
};
Теперь рассмотрим эту функцию
Ex f1() {return Ex();}
Из-за исключения копирования следующий код напечатает «h»:
int main() {
auto ex = f1();
ex.data[0] = 'h';
std::cout << ex.p[0];
}
Но рассмотрите следующую функцию
Ex f2() {
auto ret = Ex();
return ret;
}
Насколько мне известно, эта функция может быть опущена, но если это не так, следующий код будет неопределенным поведением:
int main() {
auto ex = f2();
ex.data[0] = 'h';
std::cout << ex.p[0]; // maybe derefrencing dangling pointer, maybe printing out "h"?
}
Мой вопрос: всегда ли в примере 2 поведение undefined? Это зависит от компилятора, является ли это неопределенным поведением (например, если он решил исключить или нет)? или это четко определенное поведение? (те же вопросы могут относиться и к первому примеру)