Почему я могу построить из другой структуры с удаленными конструкторами копирования/перемещения?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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