Код: Выделить всё
#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;
| ^~~
Код: Выделить всё
#include
class Foo{
public:
Foo(const Foo& foo) = delete;
explicit Foo(Foo&& foo) = default;
Foo() = default;
Foo bar(){
Foo foo;
return std::move(foo);
}
};
Я затем попытался удалить явное ключевое слово для конструктора перемещения, и все заработало, даже без std::move
Интересно, для чего нужен внутренний механизм этот. В частности, каковы подробные шаги компилятора по возврату этого значения с помощью только конструктора перемещения и какие неявные преобразования происходят в процессе возврата?
С сохранением ключевого слова явного , я также обнаружил, что если изменить строку возврата на возврат Foo(std::move(foo)), ошибка исчезнет. Но в чем разница между этим и return std::move(foo), учитывая, что оба они являются значениями rvalue. И если я хочу сохранить явный конструктор перемещения, есть ли лучший способ сделать это?
Подробнее здесь: https://stackoverflow.com/questions/787 ... onstructor
Мобильная версия