Когато се прилагат конструктори за преместване и оператори за присвояване на преместване, често се пише код по следния начин:
p = other.p;
other.p = 0;
Неявно дефинираните операции за преместване ще бъдат реализирани с код като този:
p = std::move(other.p);
Което би било погрешно, защото преместването на променлива на указател не я настройва на нула. Защо така? Има ли случаи, в които бихме искали операциите за преместване да оставят оригиналната променлива на указателя непроменена?
Забележка: Под „преместване“ не имам предвид само подизраза std::move(other.p)
, имам предвид целия израз p = std::move(other.p)
. И така, защо няма специално езиково правило, което да гласи „Ако дясната страна на дадено присвояване е указател xvalue, той се настройва на нула, след като присвояването е извършено.“?
delete p
:) - person fredoverflow   schedule 26.02.2012delete p
-- откъде компилаторът знае? Ако изисквате указателят да бъде зададен на null, задайте го на null, не карайте компилатора да го прави за класове, които не се нуждаят от него. - person   schedule 26.02.2012delete p
, така че какъв е смисълът, който се опитвате да направите? - person   schedule 26.02.2012delete p
е лош аргумент, необработените указатели никога не трябва да притежават. - person Xeo   schedule 26.02.2012T& operator=(T&&) = default;
и с моето предложение това ще направи правилното нещо. - person fredoverflow   schedule 26.02.2012unique_ptr
- person bames53   schedule 26.02.2012std::swap
върху два указателя е отличен пример за това, къде не искатеstd::move
да автоматично NULL указатели. И какво е нулевото състояние за цели числа? Вярно е, че един оптимизатор би могъл да реши случая std::swap да бъде отново идеален, но мисля, че такива случаи показват, че е по-добре да го оставим на мира. - person Johannes Schaub - litb   schedule 26.02.2012std::swap
? Не съм сигурен какво имаш предвид. Неефективност поради ненужно нулиране? - person fredoverflow   schedule 26.02.2012Note: By "moving", I do not just mean the subexpression std::move(other.p)
Ето защоstd::move
е нелепо @!#^ име за тази конструкция. - person Lightness Races in Orbit   schedule 26.02.2012move(x)
означава, че можете да лекуватеx
като rстойност. Може би щеше да е по-добре, акоmove()
се наричашеrval()
, но досегаmove()
се използва от години. - person fredoverflow   schedule 26.02.2012get_rvalue()
. Вместо това това е удобно за потребителя име, избрано поради предполагаемия най-често използван случай, но тъй като това се отнася само във връзка с други езикови функции (т.е. действително се движи), мисля, че издава целия принцип на C++. Бих приел аргументацията, че е твърде късно за промяна (и под това имам предвид по време на късните етапи на стандартизацията на C++11, когато разбрах за това бедствие). - person Lightness Races in Orbit   schedule 26.02.2012delete
на всички членове на указателя в автоматично генерирания деструктор, мога просто да кажа~T() = default;
и това ще направи правилното нещо, нали? Ама добре... ;) - person Christian Rau   schedule 26.02.2012rval
би било неправилно, защотоrval(function)
дава lvalue. - person Johannes Schaub - litb   schedule 26.02.2012