Определяет ли стандарт точно, что я могу делать с объектом после его перемещения? Раньше я думал, что все, что вы можете сделать с перемещенным объектом, - это уничтожить его, но этого было бы недостаточно.
Например, возьмите шаблон swap
функции, определенный в стандартной библиотеке:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Очевидно, что должна существовать возможность присвоения перемещенным объектам, иначе строки 2 и 3 не будут работать. Итак, что еще я могу сделать с удаленными объектами? Где именно в стандарте можно найти эти детали?
(Кстати, а почему T c = std::move(a);
вместо T c(std::move(a));
строки 1?)
источник
pop_back
переезжатьvector
. Но вы, конечно, можете узнать, так ли этоempty()
.pop_back
из пустого вvector
любом случае поведение undefined, из памяти, поэтому я почти уверен, чтоpop_back
из перемещенного вектора, показывающего поведение undefined, согласовано.pop_back
прежнему ведет себя как любой допустимый вектор (может быть даже пустой вектор).17.6.5.15 [lib.types.movedfrom]
Когда объект находится в неопределенном состоянии, вы можете выполнить любую операцию с объектом, которая не имеет предварительных условий. Если есть операция с предварительными условиями, которые вы хотите выполнить, вы не можете напрямую выполнить эту операцию, потому что вы не знаете, удовлетворяет ли неопределенное состояние объекта предварительным условиям.
Примеры операций, которые обычно не имеют предварительных условий:
get
,empty
,size
Примеры операций, которые обычно имеют предварительные условия:
Этот ответ теперь отображается здесь в формате видео: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
источник
char* buffer;
иint length;
членами, то мой ход конструктор / назначение сусло замены (или набор) значение обоих? Или было бы нормально, если бы длина не была указана (то есть,empty
иsize
возвращала бы бессмысленные значения)?