понять, баг это или нет с точки зрения стандарта, нужна помощь специалистов (@antoshkka?)
Пример следующий: https://godbolt.org/z/rv8nqj1Pc
Что должна вывести эта программа - 0, 0xBAD, implementation defined? G++ выводит 0, clang++ выводит 0xBAD
С одной стороны, стандарт говорит что "an implementation is allowed to omit the copy/move construction of a class object, even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects" и речь вроде как только о side effects от копирования и перемещения.
С другой стороны, "the implementation treats the source and target of the omitted copy/move operation as simply two different ways of referring to the same object" и вроде как clang++ именно это и делает.
Это один из пунктров приткновения по P2025 В данный момент стандарт ничего не гарантирует в случае NRVO, всё на усмотрение компилятора. Так что поведение обоих компиляторов - валидное. Другое дело, что можно выработать общие правила для NRVO, обязать компиляторы его проводить. Тогда в приведённом примере всегда будет срабатывать copy elision. поведение GCC поменяется
Обсуждают сегодня