Имбирная Ведьмочка
> Так нельзя, к моменту возврата функции пункт назначения ссылки будет уже протухнут.
А, ну да, оно же извлечется из контейнера. Ну по значению значит.
> Копирование хоть и тонкое, но всё же лишнее; а в крестах стараются придерживаться принципа
Мне кажется оптимизатор должен выкинуть это копирование, если переменная не используется. Все промежуточные классы оно же выкидывает. Вся std либа на это опирается. И из-за этого в дебаг режиме всё лютейше тормозит при использовании std
Имбирная Ведьмочка
> стд::мув изначально сам кривой. Если бы у него не было тупой перегрузки на Т конст&
У `std::move()` нет перегрузок — они ему просто не нужны:
template<typename _Tp> constexpr typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) noexcept { return static_cast<typename std::remove_reference<_Tp>::type&&>( __t); }
Dinosaur
Универсальная ссылка - считай перегрузка.
MrShoor
> Универсальная ссылка
Так здесь по-другому нельзя, потому что `move(T t)` будет копировать передаваемые в него именованные объекты, а в `move(T& t)` нельзя передать, например, безымянные объекты.
Dinosaur
> У `std::move()` нет перегрузок — они ему просто не нужны:
Значит не хватает гардов. std::move от константной ссылки должен давать ошибку компиляции.
Элементарно дописать
static_assert(!std::is_const_v<std::remove_reference_t<_Tp>>, "Attempt to pass a const value into std::move");
И всё, больше никаких внезапных копирований.
Имбирная Ведьмочка
> std::move от константной ссылки должен давать ошибку компиляции.
Никто не мешает сделать сделать тип с конструктором и/или `operator =`, принимающим константную rvalue-ссылку. Не std::move-у решать, для каких типов его можно использовать. Название у него, может, и не самое удачное, т.к. сам он ничего не перемещает, но написание чего-нибудь вроде `std::as_rvalue_reference()` везде, где нужно обратиться к конструктору/оператору перемещения, было бы не меньшим трэшем.
Dinosaur
> std::as_rvalue_reference
str::rvalue() достатчно. Не обязательно писать std::cast_to_real_rvalue_reference_and_return_it()
Dinosaur
> Никто не мешает сделать сделать тип с конструктором и/или `operator =`, принимающим константную rvalue-ссылку.
Никто, кроме здравого смысла. Это бред из той же категории, что и void operator== — синтаксически допустимо, но в реальности это бессмысленная хрень, которую не пропустят ни на одном код ревью.
Имбирная Ведьмочка
> Эти твои додумки только затем и нужны, что стд::мув изначально сам кривой. Если бы у него не было тупой перегрузки на Т конст& — то никакие лишние приседания бы и не понадобились.
я тебе уже объяснил почему мув такой какой он есть, печально что ты это до сих пор не понял. И как проверить на мувабельность тоже показал, но ты зачем то решил воспользоваться проверкой is_const которая в данном случае костыль не решающий толком проблемы, а лишь гримируя её.
Aroch
> я тебе уже объяснил почему мув такой какой он есть, печально что ты это до сих пор не понял
Для шаблонного метакода могли бы ввести move_if_not_const
Aroch
> И как проверить на мувабельность тоже показал
А покажи ещё, как сделать так, чтоб невозможно было НЕ проверить на мувабельность?
Я вот отсылаю код на ревью, в нём куча std::move, это теперь мне надо каждый заменить на nda_project::move_only_non_const?
1 frag / 2 deaths
> А покажи ещё, как сделать так, чтоб невозможно было НЕ проверить на мувабельность?
что тебе не понятно с предыдущей страницы? Не умеешь писать концепты? Страдай тогда. Ну или по старинке наследуйся и вешай ограничения в базовых классах.
Aroch
> я тебе уже объяснил почему мув такой какой он есть, печально что ты это до сих пор не понял.
Где? "Потому что в кишках стл на нём уже висит мегатонна легаси", это вот это было объяснение? Это "объясняет" только то, почему функцию не переделывают сейчас, но не почему она изначально такая всратая.
Aroch
> И как проверить на мувабельность тоже показал, но ты зачем то решил воспользоваться проверкой is_const которая в данном случае костыль не решающий толком проблемы, а лишь гримируя её.
А какая разница? Суть одна — если тонким перемещением обойтись нельзя, то это ошибка компиляции. Проверка на конст это вполне решает. Пример с сетом такая конструкция бы поймала.
Имбирная Ведьмочка
> А какая разница?
большая разница, если объект поддерживает копирование, то все вопросы к объекту а не к муву.
Aroch
> большая разница, если объект поддерживает копирование, то все вопросы к объекту а не к муву.
(Петух конст&) биндится и под Петух рвалью, Петух&& просто перехватывает приоритетом при наличии. Статик_ассёрт в муве проверяет не наличие специализации в классе, а принципиальную возможность для одного конкретного выражения.