Tại sao gọi std :: di chuyển trên đối tượng const
gọi hàm tạo bản sao khi được truyền cho một đối tượng khác? Cụ thể, mãTại sao gọi std :: di chuyển trên đối tượng const gọi hàm tạo bản sao khi được truyền cho đối tượng khác?
#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));
}
thất bại trong việc biên dịch với thông điệp:
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
Chắc chắn, tôi hy vọng nó sẽ thất bại bởi vì chúng tôi không thể di chuyển một giá trị const
. Đồng thời, tôi không hiểu được con đường mà đoạn mã lấy trước khi nó cố gắng gọi hàm tạo bản sao. Có nghĩa là, tôi biết rằng std::move
chuyển đổi phần tử thành giá trị x, nhưng tôi không biết mọi thứ diễn ra như thế nào sau đó đối với const
.
Lệnh 'const'ness của xúc động đối tượng không thay đổi, 'Foo const &&' không thể liên kết với 'Foo &&' để trình biên dịch cố gắng truy cập vào hàm tạo bản sao, không thành công vì nó bị xóa. – user657267
Tôi không có chuyên gia về các toán tử di chuyển, nhưng có thể là bạn có thể gọi di chuyển trên giá trị 'const', nhưng kết quả từ đó chỉ có thể được chấp nhận vào hàm tạo bản sao, do đó trình biên dịch quyết định gọi đó. – BWG
"Có nghĩa là, tôi biết rằng std :: di chuyển chuyển đổi phần tử thành giá trị x" Thực ra, nó không. Nó trả về một tham chiếu rvalue cho item. –