LINUX.ORG.RU

Конструктор копирования

 ,


0

1

Что-то не могу понять почему код не компилируется? У меня код вида:

class MyClass
{
public:
   class MyNestedClass
   {
   public:
       MyClass* owner;
       MyNestedClass(MyClass* owner_p) : owner(owner_p) {}
       MyNestedClass(const MyNestedClass&)=delete;
   }nested_class = this; // <--- вот тут если заменить на nested_class{this};  то все будет компилироваться

   MyClass();
   MyClass(const MyClass&)=delete;
};

Ошибка имеет вид: use of deleted function ‘MyClass::MyNestedClass::MyNestedClass(const MyClass::MyNestedClass&)’

★★★★

Последнее исправление: pathfinder (всего исправлений: 1)

если заменить на nested_class{this}; то все будет компилироваться

Тому что это brace initialization.

thunar ★★★★★
()

Пока не пришли мудрецы и не блеснули знаниями стандарта, я повангую, что запись

nested_class = this

Требует наличия конструктора копирования. Хотя он даже вызываться не будет. Но его наличие требуется. У тебя он удалён.

А когда ты пишешь {}, то прямо вызываешь конструктор объекта.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

нет же, this в данном выражении это MyClass. Что там должно быть MyNestedClass = MyClass? А nested_class{this} вполне инициализируется т.к. public owner. MyNestedClass(MyClass*) здесь не используется.

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 4)
Ответ на: комментарий от anonymous2

нет же, this в данном выражении это MyClass. Что там должно быть MyNestedClass = MyClass?

Я explicit для конструктора не добавлял.

pathfinder ★★★★
() автор топика
Ответ на: комментарий от anonymous2

Если не удалять конструктор копирования, то код с = this компилируется.

ox55ff ★★★★★
()
Ответ на: комментарий от anonymous2

нет же, this в данном выражении это MyClass

Ну и? До C++17, концептуально, nested_class = thisnested_class(MyNestedClass(this)), а инициализация nested_class MyNestedClass(this)-ом выбирает конструктор копирования.

А nested_class{this} вполне инициализируется т.к. public owner. MyNestedClass(MyClass*) здесь не используется.

Бред.

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 2)

A a{x} => вызов конструктора от x, без операции присваивания.

A a = x => создание объекта из x и вызов копирующего конструктора

faq2
()
Последнее исправление: faq2 (всего исправлений: 1)

«Два вопроса... точнее один» (с)

Чтобы что?

slackwarrior ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.