// This is fine...
DelDef del_def;
Это нормально, потому что используется инициализация по умолчанию. DelDef
и UseDelDef
оба по умолчанию инициализируются.
auto udd = UseDelDef();
До C ++ 17 это значение инициализирует временный UseDelDef
(что нормально) и затем копирует -инициализируется udd
из временного (ходом). Это неправильно сформировано, потому что UseDelDef
не является подвижным (потому что DelDef
не является подвижным (из-за конструктора удаленной копии)).
Начиная с C ++ 17, программа хорошо сформирована, потому что udd
инициализируется непосредственно из выражения, которое используется для инициализации выражения prvalue, и временный объект не задействован (это изменение правил называлось «гарантированное исключение копирования»). Вы можете исправить это для pre-C ++ 17, просто используя инициализацию по умолчанию вместо инициализации копирования, как вы использовали в конструкторе:
int main()
{
UseDelDef udd;
}
Или вы можете использовать компилятор, соответствующий C ++ 17.