Стандартная политика библиотеки относительно назначения перемещения заключается в том, что the implementation is allowed to assume that self-assignment will never happen; это кажется мне очень плохой идеей, учитывая, что:В чем обоснование для операторов присваивания нестандартных операций назначения в стандартной библиотеке?
- «обычный» («копировать») договор назначения на C++ всегда считался безопасным с самоналожением; теперь у нас есть еще один некогерентный угловой случай C++, чтобы помнить и объяснять - и тоже очень опасный; Я думаю, мы все согласны с тем, что в C++ требуется не больше скрытых ловушек;
- это усложняет алгоритмы - все в семье
remove_if
необходимо позаботиться об этом угловом корпусе; - было бы очень легко выполнить это требование - там, где вы реализуете перемещение с заменой, оно приходит бесплатно, и даже в других случаях (где вы можете получить повышение производительности с помощью ad-hoc-логики) это просто сингл (почти) никогда не брали ветку, которая практически свободна на любом CPU¹; также в большинстве интересных случаев (перемещение с параметрами или локалями) ветвь будет полностью удаляться оптимизатором при вставке (что должно происходить почти всегда для «простых» операторов присваивания перемещения).
Итак, почему такое решение?
¹ Особенно в коде библиотеки, где исполнители могут свободно эксплуатировать компилятор конкретных намеков на «ветвь Ожидаемого результата» (думает, что в НКУ __builtin_expect
/__assume
в VC++).
Найдено [этот ответ] (http://stackoverflow.com/a/9322542/4342498). Это хорошо читать, но на самом деле не отвечает на вопрос. – NathanOliver
@NathanOliver: да, я уже прочитал это, и, к сожалению, это оставило меня с большим сомнением, чем раньше = ( –
[LWG 2468] (http://cplusplus.github.io/LWG/lwg-active.html#2468) ' что самонаводящее присваивание приводит к действительному, но неуказанному состоянию. –