Нахождение ссылки на удаленную функцию

IDE — Visual Studio Express 2013 для настольных ПК

C ++ 11

Проблема — у меня есть класс, который, по-видимому, копируется (используя конструктор копирования). Если я объявлю конструктор копирования следующим образом:

MyClass(const MyClass&) = delete;

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

Есть ли способ найти источник ссылки?

Я попытался определить конструктор копирования с точкой останова, но он никогда не срабатывает.

Извините, это действительно показывает, где находится ссылка — в каком-то распределителе в STL. Мне удалось отследить его до вызова std :: vector :: emplace_back (), который должен вызвать копию. Я буду исследовать это.

Обновление 2

Я такая тупица — у меня был вектор MyClass …

-2

Решение

Возможно, вы столкнулись со следующим ошибка компилятора:

http://connect.microsoft.com/VisualStudio/feedback/details/889420/issue-with-delete

В нем говорится, что IDE (IntelliSense) жалуется, а компилятор — нет, что объясняет, почему вы не опубликовали ни одного сообщения об ошибке компилятора, и почему вы могли на самом деле выполнить скомпилированную программу с точками останова.

Саму ошибку легко воспроизвести:

struct Example
{
Example() {}
Example(Example const &) = delete;
};

Example f()
{
return Example();
}

int main()
{
Example e = f();
}

Скомпилировано с VC 2013, как это:

cl /nologo /EHsc /W4 /Za stackoverflow.cpp

Нет ошибок, нет предупреждений.

Теперь, если вы идете в http://www.compileonline.com/compile_cpp11_online.php вместо этого и скомпилировать тот же код с GCC 4.7.2, там являются ожидаемые ошибки компилятора:

main.cpp: In function ‘Example f()’:
main.cpp:9:18: error: use of deleted function ‘Example::Example(const Example&)’
return Example();
^
main.cpp:4:3: error: declared here
Example(Example const &) = delete;
^
main.cpp: In function ‘int main()’:
main.cpp:14:17: error: use of deleted function ‘Example::Example(const Example&)’
Example e = f();
^
main.cpp:4:3: error: declared here
Example(Example const &) = delete;
^

Итак, у вас на самом деле есть две проблемы:

  1. У вашего компилятора есть ошибка. Это может быть решено только путем обновления до более новой версии, если / когда она доступна.

  2. Ваш код вызывает конструктор копирования для класса, который не позволяет копировать.

Вторая проблема может быть решена путем рассмотрения правил, когда C ++ копирует объект «косвенно» или требует наличия конструктора копирования даже если фактическое копирование оптимизировано. Проверьте код еще раз, ища следующие случаи:

  • Передать по значению. void f(MyClass obj);,
  • Возврат по значению MyClass f();,
  • Метание. throw MyClass();

Первый легко исправить:

void f(MyClass const &obj);

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

3

Другие решения


По вопросам рекламы [email protected]