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

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Возврат объекта только с явным конструктором перемещения

Сообщение Anonymous »

Следующий код не скомпилируется:

Код: Выделить всё

#include 

class Foo{
public:
Foo(const Foo& foo) = delete;
explicit Foo(Foo&& foo) = default;
Foo() = default;
Foo bar(){
Foo foo;
return foo;
}
};
с сообщением компилятора:

Код: Выделить всё

test_rand.cpp:10:16: error: use of deleted function ‘Foo::Foo(const Foo&)’
10 |         return foo;
|                ^~~
test_rand.cpp:5:5: note: declared here
5 |     Foo(const Foo& foo) = delete;
|     ^~~
Полагая, что это связано с тем, что конструктор копирования удален, и когда функция возвращает временную переменную, необходимо создать временную переменную, я добавил std::move, чтобы сделать foo значение r, чтобы можно было вызвать конструктор перемещения.

Код: Выделить всё

#include 

class Foo{
public:
Foo(const Foo& foo) = delete;
explicit Foo(Foo&& foo) = default;
Foo() = default;
Foo bar(){
Foo foo;
return std::move(foo);
}
};
Однако компилятор выдает мне точно такую ​​же ошибку «использование удаленной функции 'Foo::Foo(const Foo&)'».
Я затем попытался удалить явное ключевое слово для конструктора перемещения, и все заработало, даже без std::move
Интересно, для чего нужен внутренний механизм этот. В частности, каковы подробные шаги компилятора по возврату этого значения с помощью только конструктора перемещения и какие неявные преобразования происходят в процессе возврата?
С сохранением ключевого слова явного , я также обнаружил, что если изменить строку возврата на возврат Foo(std::move(foo)), ошибка исчезнет. Но в чем разница между этим и return std::move(foo), учитывая, что оба они являются значениями rvalue. И если я хочу сохранить явный конструктор перемещения, есть ли лучший способ сделать это?

Подробнее здесь: https://stackoverflow.com/questions/787 ... onstructor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»