Конструкторы перемещения explicit
могут влиять на совместимость, например, с Стандартные алгоритмы. Например, std::swap<T>
требует, чтобы T
было MoveConstructible. В свою очередь, MoveConstructible указывается в терминах выражения, а именно T u = rv;
(где rv
- это значение типа T
).
Если для данного типа нет ни явного конструктора копирования, ни неявного конструктора перемещения, тогда T u = rv;
недопустим и этот тип нельзя использовать с std::swap
. (В этом конкретном случае, однако, можно специализировать std::swap
для обеспечения желаемой функциональности, например, используя T u(rv);
).
Проще говоря, конструктор перемещения или копирования explicit
не поддается ожиданиям и не может использоваться также с общим кодом.
Некоторые другие части стандартной библиотеки, которые предъявляют требование MoveConstructible:
- удалитель
unique_ptr<T, D>
- обертки вызовов, используемые, например,
bind
(все переданные распадающиеся типы касаются)
thread
, async
, call_once
(все указано в терминах упаковщиков вызовов)
sort
, stable_sort
, nth_element
, sort_heap