2013-02-21 25 views
24

Mã sau đây biên dịch và chạy trên MSVC2010, phải không?Nên std :: di chuyển thả constness?

const std::string s = "foo"; 
std::string s2(std::move(s)); 

tôi có thể thấy tại sao điều này có lẽ sẽ không phá vỡ bất cứ điều gì vì nếu tôi đi internals s tôi phải biết rằng không ai sẽ sử dụng nó để nó Dosn't vấn đề mà tôi đang thả const. Tuy nhiên những gì về nơi trình biên dịch thực hiện các đối tượng const trong ROM (trong một ứng dụng nhúng)? Liệu động thái sẽ biến thành một bản sao? Hoặc nên MSVC cho tôi một lỗi?

+0

có thể nó biên dịch do một số tối ưu hóa? – SomeWittyUsername

+2

@icepack không, biên dịch, đặc biệt là kiểm tra tính chính xác của const vv đến trước khi tối ưu hóa. –

+1

@icepack quy tắc tối ưu hóa vàng là quy tắc as-if. Trình biên dịch không thể thực hiện tối ưu hóa mà không hoạt động như - nếu chúng không được áp dụng (về hành vi quan sát và trong các quy tắc được nêu ra bởi ngôn ngữ). –

Trả lời

29

Tôi nghĩ std::move(T const&) chỉ trả lại T const &&. Điều này có nghĩa, nó sẽ không thực sự được chuyển từ (vì các toán tử gán/di chuyển không khớp với kiểu param).

gì xảy ra là, rằng các nhà xây dựng tham T const& phù hợp với lvalue (các biếnT const &&) và như vậy, động thái thoái hóa thành một bản sao.

+3

@AndyProwl có vẻ như mỗi lần tôi hỏi một cái gì đó ở đây bạn đang ở đó để trả lời :) của bạn giống như hình thức mọt sách của một thiên thần hộ mệnh;) – odinthenerd

+1

@PorkyBrain: Đó là âm thanh SO sai: D –

+0

Tôi nghĩ câu thứ hai là một chút gây hiểu lầm . Tham số tham chiếu Lvalue * không bao giờ * khớp với tham chiếu rvalue, nhưng tạm thời có thể liên kết với tham chiếu const-lvalue ... –

23

Đây không phải là sự khác biệt cho

const std::string f() { return "foo"; } 
std::string s2 = f(); 

Đây là, cùng một lúc, nên C++ 03, và Ủy ban đã không nghỉ mã này khi giới thiệu tài liệu tham khảo rvalue. Nó chỉ đơn giản là suy thoái thành một bản sao.

+0

So sánh tốt với tình huống di chuyển tiềm ẩn. +1 – sehe

+1

+1 cho lý do hợp lệ –

+1

+1 quá tệ Tôi không thể chấp nhận nhiều câu trả lời – odinthenerd

Các vấn đề liên quan