Убедитесь, что конструктор копирования никогда не вызывается, когда существует конструктор перемещения

При разработке класса, который можно перемещать, но не копировать, естественно объявить конструктор копирования закрытым. При наличии только перемещаемых и тривиально копируемых объектов в качестве членов экземпляра имеет смысл разрешить компилятору неявно генерировать конструктор перемещения.

Однако при поддержке как VS11, так и G++4.7 я обнаружил несовместимость:

  • VS11 требует явно определенных конструкторов перемещения
  • G++ требует, чтобы явные конструкторы перемещения имели либо соответствующий общедоступный конструктор копии, либо ключевое слово noexcept.
  • VS11 не поддерживает ключевое слово noexcept.

Как видите, это ставит меня в тупик. Мой класс нельзя копировать. Я должен поддерживать как VS11, так и MinGW/GCC. Мне нужно, чтобы мой класс можно было перемещать.

Я что-то не так понял, или есть способ обойти эту крошечную проблему? Могу ли я сделать компиляцию неудачной, если сгенерирован вызов конструктора копирования? Есть ли лучшее решение этой проблемы?


person Max    schedule 19.10.2012    source источник


Ответы (1)


Если вы добавите это в исходный файл

#ifdef _MSC_VER
#define noexcept
#endif

Вы сможете определить его как noexcept в GCC, но VC++ проигнорирует noexcept.

person Dirk Holsopple    schedule 19.10.2012