2016-12-14 1 views
4

Учитывая, что a и b имеют тип T, и у нас есть либо движение по строительству (T b(move(a));), либо переместить назначение (b = move(a)). В каких случаях мы знаем, что будет стоить a?C++: для каких объектов, «перемещенных», подразумевается больше, чем «оставаться в силе»?

Единственное, что я знаю наверняка, это unique_ptr, в котором a станет пустой стрелкой. Это также гарантировано для shared_ptr? Существуют ли другие классы, для которых стандарт гарантирует известное значение?

+1

http://stackoverflow.com/questions/34772219/which-std-types-are-guaranteed-to-be-empty-null-after-being-used-as-arg-in-move –

ответ

1

Стандартные типы библиотек

От стандартной N4296, §17.6.3.1, давайте rv быть Rvalue типа T, в таблице 20, MoveConstructible требования и Таблица 22 MoveAssignable требования.

После операции: состояние

T(rv); 
T u =rv; 
u = rv; 

с.в. не определен [Примечание: с.в. должны по-прежнему соответствовать требованиям компонента библиотеки, которая использует его. Операции, перечисленные в этих требованиях, должны работать как указано независимо от того, был ли rv перемещен из или нет. - примечание окончания)

Это означает, что по крайней мере ваш перемещенный объект все еще находится в допустимом состоянии и может использоваться как любой объект его типа. Но больше ничего не требуется в качестве требования к библиотеке. Вы должны прочитать конкретную документацию.

Для shared_ptr specificaly:

shared_ptr(shared_ptr&& r) noexcept; 
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 

Примечание: второй конструктор не должен участвовать в разрешении перегрузки, если Y * не конвертируется до Т *.

Эффекты: Move-constructs экземпляр shared_ptr из r. Постусловия: * это должно содержать старое значение r. r должно быть пустым. r.get() == nullptr.

Основные типы и тривиальным copyables

Двинутый объект должен быть неизменным. Ищу для подтверждения в стандарте ...

Другие типы

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