Что касается семантики ходу и контейнеров:C++ 11 Перемещение Семантика и STL контейнеры
Я знаю, что STL контейнеры воспользоваться ходом, когда операции перемещения определяются типом элементов. Но как он знает, определил ли элемент операции перемещения или нет?
Почему контейнеры STL просто не вызывают std :: move() на элементах, независимо от того, определил ли элемент операции перемещения или нет? Я спрашиваю об этом, потому что знаю, что вы можете вызывать std :: move() для объектов, даже если его тип не определяет никаких операций перемещения.
спасибо.
Я думаю, что это отвечает на обе части моего вопроса: STL контейнеры * не делают * фактически определяют, определены ли операции перемещения для элемента или нет, они просто вслепую звонят std :: move_if_no_throw, а затем используют разрешение перегрузки для выбора перемещения или копирования версии функции. Пожалуйста, не стесняйтесь исправить меня, если я что-то неправильно понял. Спасибо. – inhwank
Вы правы, это идея. –
Комментарий педантизма: спирт вашего ответа правильный. Однако «вызов« move_if_noexcept' вместо 'move' большую часть времени» является неточным. В большинстве случаев сильная гарантия исключений не требуется и не предоставляется. 'vector' в частности использует' move_if_noexcept' для нескольких операций, таких как 'reserve' и' push_back'. Я бы назвал это исключением, а не правилом, особенно если мы говорим обо всех std-определенных контейнерах. В большинстве случаев стандартная безопасность исключений обеспечивается стандартом и обеспечивается реализацией. –