NRVO x, а потом думает, что этот адрес алиасится с пользовательским параметром
Кто-нибудь знает, на основании какого пункта стандарта clang проводит оптимизацию?
а где тут алиасинг?
Я бы ожидал что-то вроде «нельзя получить указатель на кусок памяти для automatic storage, пока там не появился объект» (нет операций, которые могут это сделать) + «указатель был создан до вызова функции => до локального объекта»
возможно (относительно) простая эвристика что адрес на переменную с automatic storage не мог существовать до создания переменной?
если закоментить запись в data, то GCC начинает понимать что int внутри созданного типа не алиасится с data и равен 0
блин теперь мне кажется что я бы мог сломать этот пример
NrvoPassed ouch = test(&ouch.i);
из серии T x = std::move(x)?
ну это ссзб скорее. Например aligned_storage<NrvoPassed> storage; storage = test(&storage);
^ Расшевелил ребят из GCC, согласились что это бага https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80740
Обсуждают сегодня