Я думаю, что сравнение этих двух синтаксисов не является вашим реальным вопросом.
Мне кажется, что вы ожидаете, что элита C ++ 17 будет вести себя так же, как допускалась "оптимизация" до C ++ 17 по стандарту и выполняется многими реализациями.
В этой «оптимизации», хотя вызов конструктора копирования можно было исключить, он должен быть действительным и доступным.
С C ++ 17 elision это не так.
Это истинное допущение, когда просто написание T{}
на самом деле не создает T
, а вместо этого говорит: Я хочу T
", а фактическое временное явление" материализуется "только тогда, когда это необходимо.
Избыточные высказывания этого факта фактически сводятся в одно целое, поэтому, несмотря на крики" Я хочу T
! Я хочу T
! Я хочу T
! Я хочу T
! " ребенок все еще получает только один T
в конце. 10
Итак, в C ++ 17 T obj = T{...}
буквально эквивалентно T obj{...}
.
Это объясняет результаты, которые вы видите, и ваше замешательство.
Вы можете узнать больше об этой функции на cppreference.com ; Вот фрагмент из верхней части страницы:
Обязательное исключение операций копирования / перемещения
При следующих обстоятельствах компиляторы должны опускать Скопируйте и переместите конструкцию объектов класса, даже если конструктор копирования / перемещения и деструктор имеют заметные побочные эффекты. Объекты создаются непосредственно в хранилище, где они в противном случае были бы скопированы / перемещены. Конструкторы копирования / перемещения не обязательно должны присутствовать или быть доступными:
- [..]
- При инициализации объекта, когда выражение инициализатора представляет собой prvalue того же типа класса (игнорируя квалификацию cv), что и тип переменной [..]