IDE — Visual Studio Express 2013 для настольных ПК
C ++ 11
Проблема — у меня есть класс, который, по-видимому, копируется (используя конструктор копирования). Если я объявлю конструктор копирования следующим образом:
MyClass(const MyClass&) = delete;
Он жалуется на ссылку на удаленную функцию. Теперь я дважды просмотрел весь свой код и не могу найти, куда будет скопирован экземпляр класса.
Есть ли способ найти источник ссылки?
Я попытался определить конструктор копирования с точкой останова, но он никогда не срабатывает.
Извините, это действительно показывает, где находится ссылка — в каком-то распределителе в STL. Мне удалось отследить его до вызова std :: vector :: emplace_back (), который должен вызвать копию. Я буду исследовать это.
Я такая тупица — у меня был вектор MyClass …
Возможно, вы столкнулись со следующим ошибка компилятора:
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;
^
Итак, у вас на самом деле есть две проблемы:
У вашего компилятора есть ошибка. Это может быть решено только путем обновления до более новой версии, если / когда она доступна.
Ваш код вызывает конструктор копирования для класса, который не позволяет копировать.
Вторая проблема может быть решена путем рассмотрения правил, когда C ++ копирует объект «косвенно» или требует наличия конструктора копирования даже если фактическое копирование оптимизировано. Проверьте код еще раз, ища следующие случаи:
void f(MyClass obj);
,MyClass f();
,throw MyClass();
Первый легко исправить:
void f(MyClass const &obj);
Другие требуют более тщательного перепроектирования, потому что возврат или выброс напрямую противоречит идее предотвращения копий.