Почему вызов std:: move на объект const
вызывает конструктор копирования при передаче другому объекту? В частности, код
#include <iostream>
struct Foo {
Foo() = default;
Foo(Foo && x) { std::cout << "Move" << std::endl; }
Foo(Foo const & x) = delete;
};
int main() {
Foo const x; Foo y(std::move(x));
}
не удается скомпилировать сообщение:
g++ -std=c++14 test07.cpp -o test07
test07.cpp: In function 'int main()':
test07.cpp:10:36: error: use of deleted function 'Foo::Foo(const Foo&)'
Foo const x; Foo y(std::move(x));
^
test07.cpp:6:5: note: declared here
Foo(Foo const & x) = delete;
^
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
Конечно, я ожидаю, что он потерпит неудачу, потому что мы не можем переместить значение const
. В то же время я не понимаю маршрут, который выполняет код, прежде чем он попытается вызвать конструктор копирования. Смысл, я знаю, что std::move
преобразует элемент в значение x, но я не знаю, как все происходит после этого по отношению к const
.