У меня есть древовидный класс, в котором объявлены и определены конструкторы перемещения и операторы присваивания перемещения.
Зачем компилятору чувствовать необходимость синтезировать конструктор копирования, а затем жаловаться, что std::unique_ptr
имеет закрытые члены?
Это кажется контрпродуктивным. Должен ли компилятор не знать, что скрытая копия и присваивание без тела или просто не определены, чтобы предотвратить попытку скопировать std::unique_ptr
?
И почему объявление и определение конструкторов копирования и операторов присваивания с пустым телом делает компилятор счастливым?
Будет ли это поводом для беспокойства, если я продолжу писать и создавать код с использованием этого класса?
Дополнения:
Исходного кода нет, потому что нет ошибок в исходном коде... это вопрос
, который не требует наличия исходного кода.Компилятор жаловался, когда конструкторы копирования были закрытыми, поэтому я сделал их общедоступными; снова сделает приватным и проверит, есть ли сбои компилятора.
Я использую Visual Studio 2012 Professional IDE и связанные с ней компиляторы.
Почему компилятор создает конструкторы копирования при наличии конструкторов перемещения? Кажется нелогичным, особенно если конструкторы копирования не определены в первую очередь.
Дополнительный вопрос:
Ну, похоже, Visual Studio 2012 не поддерживает объявления = delete в конструкторах или операторах присваивания, и сокрытие моих объявлений заставляет компилятор плакать по всему моему коду. Что мне теперь делать? Я согласен (ниже), что объявление конструкторов копирования бездействия — плохая идея, так какие еще варианты у меня есть?
Если вам действительно нужен небольшой пример, вот он. Мой компилятор не поддерживает = удалить
class Tree{
class TreeNode{
"declaration of unique_ptr, cstrs, move cstrs, hidden copy cstrs"
};
public:
"declaration of unique_ptrs, cstrs, move cstrs, copy cstrs <----- compiler
complains if hidden"
};
Использование boost::variant с этим
boost::variant
не может содержатьunique_ptr
содержащих классы. 28.03.2013boost::variant
написан с учетом движения? Если это не так, использование его с типами только для перемещения кажется плохой идеей. Что вам нужно сделать, так это написать короткий, автономный, правильный, компилирующий (почти) пример, который точно демонстрирует вашу проблему и то, как она возникает. Вполне возможно, вы делаете что-то не так, или, может быть,boost::variant
принципиально неприменим сunique_ptr
s. 28.03.2013