У меня есть код, который я бы хотел переключить с C++ 03 на C++ 11.Перенос кода с C++ 03 на C++ 11: Должен ли я быть осторожным относительно неявного конструктора перемещения по умолчанию?
Как я понимаю, некоторые классы извлекут выгоду из этого изменения, имея неявный конструктор перемещения по умолчанию (и оператор назначения перемещения, который приходит вместе). Хотя я полностью согласен с этим (я даже думаю, что это хорошо), я немного боюсь эффектов, которые могут иметь такие неявные конструкторы для некоторых непересекающихся классов, которые у меня есть.
В одном примере у меня есть класс, который обертывает ручку iconv_t
от libiconv
для использования RAII.
Более явно, класс выглядит следующим образом:
class iconv_wrapper
{
public:
iconv_wrapper() : m_iconv(iconv_open()) {}
~iconv_wrapper() { iconv_close(m_iconv); }
private:
// Not implemented: non copyable. Should probably be = delete; in C++11.
iconv_wrapper(const iconv_wrapper&);
iconv_wrapper& operator=(const iconv_wrapper&);
iconv_t m_iconv;
};
Моего беспокойство: если экземпляр этого класса случился быть перемещен, это приведет к двойному вызову iconv_close()
. Поскольку iconv_t
является «немым» интегральным типом, я не ожидаю, что реализация по умолчанию iconv_wrapper(iconv_wrapper&&)
приведет к аннулированию члена R. Даже если бы это было так, деструктор не был реализован, чтобы справиться с этим должным образом.
Так что мои вопросы:
- ли мои опасения законным? Правильно ли, что движимый конструктор/оператор по умолчанию = будет некорректным в таком случае?
- Какие изменения я могу внести, чтобы хорошо переносить этот код на C++ 11? (Я предложил
std::unique_ptr
, но я не мог сделать эту работу хорошо, как он ожидает, что указатель, а не какой-то непрозрачный тип)
Я не думаю, что у этих классов были бы неявные конструкторы копирования или операторы присваивания, так как они объявляют пользовательский конструктор копирования и оператор присваивания. – juanchopanza
Имеет ли значение 'iconv_t' значение« null »? – woolstar
@ woolstar: [documentation] (http://pubs.opengroup.org/onlinepubs/7908799/xsh/iconv_open.html) говорит, что 'iconv_open()' возвращает '(iconv_t) -1' в случае сбоя. Поэтому я думаю, что мы можем предположить, что это значение «NULL». – ereOn