error use of deleted function

Я работал над некоторым кодом на С++, который написал друг, и я получаю следующую ошибку, которую я никогда раньше не видел при компиляции с gcc4.6:

Изменить: это происходит из части кода, использующего boost MSM: Boost Webpage

Edit2: Нет = delete() , используемого в любом месте исходного кода.

Вообще говоря, что означает эта ошибка? Что я должен искать, когда возникает этот тип ошибок?

Сообщение об ошибке ясно говорит о том, что конструктор по умолчанию был удален неявно. В нем даже сказано почему: класс содержит нестатическую константную переменную, которая не будет инициализирована ctor по умолчанию.

Поскольку X::x — это const , его нужно инициализировать — но ctor по умолчанию обычно не инициализирует его (потому что это тип POD). Поэтому, чтобы получить ctor по умолчанию, вам нужно определить его самостоятельно (и он должен инициализировать x ). Вы можете получить такую же ситуацию с участником, как ссылка:

Вероятно, стоит отметить, что оба они также отключат неявное создание оператора присваивания, по сути, по той же причине. Оператор неявного присваивания обычно выполняет присваивание по элементам, но с помощью константного или ссылочного элемента он не может этого сделать, поскольку элемент не может быть назначен. Чтобы задание работало, вам нужно написать свой собственный оператор присваивания.

Вот почему член const обычно должен быть статическим — когда вы делаете назначение, вы все равно не можете назначить член const. В типичном случае все ваши экземпляры будут иметь одно и то же значение, поэтому они могли бы также совместно использовать доступ к одной переменной, вместо того, чтобы иметь множество копий переменной, которая будет иметь одно и то же значение.

Конечно, можно создавать экземпляры с разными значениями — вы (например) передаете значение при создании объекта, поэтому два разных объекта могут иметь два разных значения. Однако, если вы попытаетесь что-то сделать, например, поменять их местами, член const сохранит свое первоначальное значение вместо того, чтобы поменяться местами.

Привет!
Прошу пояснить причину ошибки в следующем коде:

Пытаюсь создать экземпляр класса с удаленными конструкторами копирования и перемещения:

И получаю ошибку компилятора:

Singleton.h: In instantiation of ‘static vo > mycode.cpp:16:47: required from here
Singleton.h:34:34: error: use of deleted function ‘MyClass(MyClass&&)’
static T instance(arsg. );
^
In file included from mycode.cpp:6:0:
mycode.h:82:5: note: declared here
My >
Понимаю что компилятор хочет конструктор, но почему он его хочет? Подскажите где про это почитать

  • Вопрос задан более года назад
  • 317 просмотров

16.04.9) 5.4.0 20160609

Просто замените круглые скобки на фигурные в списке инициализации: пример.

Пустой список аргументов не может быть передан в конструктор через круглые скобки — иначе это будет эквивалентно строке MyClass value(); — а это уже объявление функции. Из-за этого пустой список аргументов интерпретироваться как пустой список инициализации, но пустой список инициализации опять же нельзя передать в конструктор без аргументов, используя круглые скобки, т.к. один аргумент всё-таки есть. Но при использовании фигурных скобок список инициализации нормально вызывает конструктор без аргументов. При этом неявное преобразование из пустого списка инициализации в MyClass возможно — неявно вызывается конструктор без аргументов:

А значит строка MyClass(<>) преобразует <> во временный объект MyClass , а его попытается передать в удалённый конструктор перемещения MyClass

Problem

I was compiling C++ code that uses the Boost library when the compiler threw out this mysterious error:

Solution

This type of error typically occurs when there is a feature mismatch between the C++ compiler and the library code. In this case, I was using the Boost library version 1.48.0, which is from Ubuntu 12.04. However, I was using a newer version of the g++ compiler since the code used C++11 features. The version that is in Ubuntu was 4.6, while I using a more recent version 4.8 compiler.

One solution is to go back and use an older version of the C++ compiler. The other solution is to upgrade the Boost library to a more recent version. I chose the second solution and upgraded Boost to version 1.54 and the code compiled without errors.

Оцените статью