Почему std::weak_ptr не имеет конструктора перемещения или оператора присваивания перемещения?

Просматривая 1,53 заголовка boost для weak_ptr, я был удивлен, увидев, что назначение перемещения и конструкторы перемещения были реализованы, даже если они не были задокументированы. Из этой документации нет никаких требований к std::weak_ptr для обеспечения функциональности перемещения.

Просматривая реализацию слабого_птру в Visual Studio 2012, я не замечаю каких-либо очевидных операций перемещения, объявленных в слабом_птре, хотя они могут быть скрыты за наследованием. Тем не менее, этот код приводит к тому, что окно наблюдения сообщает об одной общей ссылке и двух слабых ссылках для указателей, что заставляет меня поверить, что weak_ptr не поддерживает перемещение:

std::shared_ptr<int> ptr(std::make_shared<int>(5));
std::weak_ptr<int> weakptr(ptr);
std::weak_ptr<int> movedWeakPtr(std::move(weakptr));

Есть ли веская причина, по которой std::weak_ptr не обеспечивает функциональность перемещения? Если нет, то следует ли считать, что weak_ptr является подвижным типом?

1 ответ

Решение

Каждый тип, который является копируемым, по определению является подвижным. weak_ptr копируемый, и, следовательно, он является подвижным.

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

Другие вопросы по тегам