2014-02-06 2 views
3

Что касается семантики ходу и контейнеров:C++ 11 Перемещение Семантика и STL контейнеры

  1. Я знаю, что STL контейнеры воспользоваться ходом, когда операции перемещения определяются типом элементов. Но как он знает, определил ли элемент операции перемещения или нет?

  2. Почему контейнеры STL просто не вызывают std :: move() на элементах, независимо от того, определил ли элемент операции перемещения или нет? Я спрашиваю об этом, потому что знаю, что вы можете вызывать std :: move() для объектов, даже если его тип не определяет никаких операций перемещения.

спасибо.

ответ

7

Короче говоря, это именно то, что они делают, позвонив по телефону std::move, не заботясь, сможет ли он переместить или просто скопировать.

Следует отметить, что некоторые функции, предлагающие надежную гарантию исключения, например std::vector::resize, назовут менее известным std::move_if_nothrow вместо std::move.

+1

Я думаю, что это отвечает на обе части моего вопроса: STL контейнеры * не делают * фактически определяют, определены ли операции перемещения для элемента или нет, они просто вслепую звонят std :: move_if_no_throw, а затем используют разрешение перегрузки для выбора перемещения или копирования версии функции. Пожалуйста, не стесняйтесь исправить меня, если я что-то неправильно понял. Спасибо. – inhwank

+0

Вы правы, это идея. –

+3

Комментарий педантизма: спирт вашего ответа правильный. Однако «вызов« move_if_noexcept' вместо 'move' большую часть времени» является неточным. В большинстве случаев сильная гарантия исключений не требуется и не предоставляется. 'vector' в частности использует' move_if_noexcept' для нескольких операций, таких как 'reserve' и' push_back'. Я бы назвал это исключением, а не правилом, особенно если мы говорим обо всех std-определенных контейнерах. В большинстве случаев стандартная безопасность исключений обеспечивается стандартом и обеспечивается реализацией. –

Смежные вопросы