Почему я могу построить из другой структуры с удаленными конструкторами копирования/перемещения?C++

Программы на C++. Форум разработчиков
Anonymous
Почему я могу построить из другой структуры с удаленными конструкторами копирования/перемещения?

Сообщение Anonymous »

Я определяю две структуры и удаляю конструкторы копирования/перемещения из обеих, но каким-то образом все еще могу создать что-то, что мне не по силам.
Короче говоря, я пытаюсь понять, как могу ли я построить const_Obj из const_Obj, когда конструкторы копирования/перемещения были удалены. Единственный конструктор — это Obj, а не const_Obj. Точно так же я сузил список конструкторов для Obj до одного с const_Obj const&, который все еще позволяет это сделать.
Я подозреваю, что это так. почему-то думает, что у меня есть оператор преобразования для обоих, и делает это в два этапа, примерно так:
const_Obj( Obj&&(const_Obj const&) )

но я не знал, что компилятор может выполнять такое преобразование в несколько этапов. Я предполагаю, что это работает только потому, что это ссылка на rvalue, означающая, что она просто «переименовывает» переменную и может «пропустить» это преобразование в Obj прямо в const_Obj?
Изменить: я могу добиться желаемого поведения, добавив явное описание в конструктор Obj. Все еще удивительная возможность использования неявной конструкции (оператора преобразования)?
код на godbolt
#include
#include

template
class Obj;

template
class const_Obj;

template
class Obj
{
public:
Obj(Obj const& other) {}
Obj(Obj&& other) {}
auto operator=(Obj const& other) {}
auto operator=(Obj&& other) {}

template requires std::assignable_from //

Подробнее здесь: https://stackoverflow.com/questions/792 ... ctors-dele

Вернуться в «C++»