Нужно ли мне переносить std:: move в мое ядро?

Я обеспокоен тем, что в ядре ядра у меня не будет доступа к вещам типа std::move, std::forward, std::initializer_list и т.д. Хотя некоторые из этих функций встроены в язык, они по-прежнему требуют соответствующих заголовков и реализация библиотеки. Является ли следующее достаточным, чтобы воспользоваться семантикой перемещения, или мне нужно пройти девять ярдов и перенести библиотеку С++?

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{
  return static_cast<typename remove_reference<T>::type&&>(arg);
}

Ответы

Ответ 1

Это должно сделать это, не допуская опечаток. Полное определение дается в стандарте (два на самом деле: старое и новое), а я сделал именно это: просто скопировать официальную версию в свой собственный заголовок, а затем обратиться к моим специальным требованиям и/или поддерживать старый gnu std lib, но компилятор ссылается на ссылки rvalue.

Для адреса @T.C. беспокойство, все же полезно иметь возможность писать мои собственные типы только для перемещения и иметь возможность использовать их, например. возврат из функций, даже если поставляемые контейнеры не знают об этом. Классы класса Boost делают, и вы можете переопределить конфигурацию, чтобы сообщить Boost, что у вас есть & &, если вы поставляете все std:: move, std:: forward и еще что-то, что ему нужно. Я также получил гибридный подход, используя собственные ссылки rvalue и эмуляцию Boost move, работающую одновременно, для совместимости с кодом, скомпилированным с Boost как обычно настроенным.