Переместить подпись конструктора

Из этой ссылки он позволяет использовать const rvalue как конструктор перемещения

Type::Type( const Type&& other );

Как движимый объект может быть const ? Даже если это было технически разрешено, есть ли случай, когда такое заявление было бы полезно?

7
добавлено отредактировано
Просмотры: 2
nl ja de
Ну, Type может объявить переменную изменчивый и переменные </>> изменяемые переменные can будут изменены const переместить конструкторы. Поэтому конструктор перемещения const может просто сделать мелкую копию объекта (в то время как конструктор копирования может сделать глубокую копию) и установить изменяемый логический флаг, называемый dead или что-то в этом роде для true для перемещенного объекта. Тогда функции Type (что наиболее важно, деструктор) будут проверять этот флаг. Это вздор?
добавлено автор Andy Prowl, источник
Простой ответ: Нет, нет, поскольку он побеждает всю цель семантики движения. Также обратите внимание, что && не обязательно говорит «movable». Он просто говорит «rvalue reference». И MoveConstructible возвращается на копирование, если нет перемещения ctor, поэтому вы можете сказать, что T const && move ctor может просто скопировать, но eh.
добавлено автор Xeo, источник

2 ответы

Как может подвижный объект быть const ?

Это не может, но это не то, что говорит язык. Язык говорит, что конструктор с этой сигнатурой является «конструктором перемещения», но это не означает, что аргумент перемещается, это просто означает, что конструктор отвечает требованиям «конструктора перемещения». Конструктор перемещения не обязан ничего перемещать, и если аргумент const , он не может.

Есть ли случай, когда такое объявление было бы полезно?

Да, но не очень часто. Это может быть полезно, если вы хотите, чтобы другой конструктор выбирался с помощью разрешения перегрузки, когда в качестве аргумента передается const-время.

struct Type
{
  template
    Type(T&&); //accepts anything

  Type(const Type&) = default;    
  Type(Type&&) = default;
};

typedef const Type CType;

CType func();

Type t( func() );  //calls Type(T&&)

В этом коде временный, возвращаемый из func() , не будет точно соответствовать параметрам конструктора или переместить конструкторы, поэтому вызовет конструктор шаблона, который принимает любой тип. Чтобы предотвратить это, вы можете предоставить другую перегрузку, принимающую значение const rvalue, и либо делегировать конструктору копии:

Type(const Type&& t) : Type(t) { }

Или, если вы хотите предотвратить компиляцию кода, определите его как удаленный:

Type(const Type&& t) = delete;

См. https://stackoverflow.com/a/4940642/981959 для примеров из стандарта, использующего ссылку const rvalue.

8
добавлено

Некоторые предпосылки для намерения этой функции.

Ссылки на Rvalue - из блога Bjarne Stroustrup

Предложение добавить поддержку семантики перемещения на язык C ++

Интересный вопрос. Я где-то читал объяснение этого вопроса Страуступом, но, похоже, не нашел его обратно. Надеюсь, что выше это помогает.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest