2017-01-30 19 views
4

Я заметил ошибку при попытке скопировать unique_ptr (например, назначить один уникальный указатель на другой) являетсяВыполнение const unique_ptr, а затем попытка std :: move from дает такую ​​же ошибку, как если бы вы пытались получить доступ к конструктору копирования

Error C2280 std::unique_ptr<int,std::default_delete attempting to reference a deleted function ptrTest c:\ptrtest\main.cpp 7 
#include <memory> 

int main() 
{ 
    std::unique_ptr<int> a = std::make_unique<int>(2); 
    std::unique_ptr<int> b = a; 
} 

это нормально, так как unique_ptr не имеет конструктор копирования. Вы не копируете с уникальных указателей, чтобы переместить (передать право собственности на указатель) между ними.

Интересно (ОК, возможно, нет), этот код вызывает ту же ошибку. Теперь я знаю, что это неверно (я объявил первый unique_ptr как неизменяемый объект), но сообщение об ошибке означает, что он пытается вызвать конструктор копирования. Это верно?

#include <memory> 

int main() 
{ 
    const std::unique_ptr<int> a = std::make_unique<int>(2); 
    std::unique_ptr<int> b = std::move(a); 
} 
+2

так как 'a' является конструктором const move не является допустимым кандидатом – Sopel

+1

Именно поэтому' unique_ptr' превосходит 'auto_ptr'. :-) 'auto_ptr' был бы скомпилирован здесь и молча изменил значение const. –

+0

@Sopel, извинения, не следуя тому, что вы написали. – Prof

ответ

7

Да.

Единственный потенциально потенциальный потенциальный кандидат на вызов во время поиска - это конструктор копирования, поскольку компилятор пытается выполнить инициализацию экземпляра & hellip; который он находит, невозможно, потому что указанный конструктор удален. Это многоступенчатый процесс.

Вы можете назвать это причудой C++, , возможно,, поскольку диагностика - это небольшая утечка абстракции. Но это имеет смысл с технической точки зрения.

+0

Возможно, это не помешало ему создать конструктор 'unique_ptr (unique_ptr const &&) = delete;'. – Barry

+0

@ Светлые гонки на орбите. Что вы подразумеваете под поиском? Делает ли он попытку std :: move, понимает, что не может перемещать const std :: unique_ptr , поскольку нет конструктора перемещения с const std :: unique_ptr && определено. Итак, тогда он пытается сделать копию, а затем понял, что нет конструктора копирования? – Prof

+3

@Prof: _ «Он пытается std :: move» _ Я не уверен, что вы подразумеваете под этим. Вы не можете «попытаться« std :: move »; 'std :: move' - это просто отличное от rvalue. Сначала компилятор ищет конструктор ** non-'const' **, берущий ссылку rvalue, но он не может найти его, поэтому он начинает искать конструкторы копирования. Он находит одно и «хочет» использовать его, но позже находит, что он был удален. _ «нет конструктора копирования» _ Существует конструктор копирования, но он был «удален». Там есть тонкая разница, которая является ключевым здесь. –