2011-08-22 27 views

Trả lời

8

Không giống như vậy mỗi se, vì hàm phải sửa đổi biến a tương đương. Điều đó nói rằng, sau khi nội tuyến và một chút tối ưu hóa tầm thường kết quả sẽ là như nhau:

int x = func(5); 

// pseudo-inlined: 
int __temp = 5; // the temporary created by binding 5 to int&& 
__temp = 3; // a = 3; 
int x = __temp; // return a; 

// constant propagation: 
int __temp = 5; 
__temp = 3; 
int x = 3; 

// dead-code elimination: 
int x = 3; 

Lưu ý kết quả là giống như nếu bạn sử dụng định nghĩa thứ hai của func và sắp xếp theo hàng chỉ vì các biến tạm thời wasn' t được sử dụng. Điều này cho thấy hai chức năng không tương đương nói chung:

int modifyme = 100; 
int x = func(std::move(modifyme)); 

// modifyme must be 3, second function definition wouldn't do that 
+0

Tôi đã nghĩ rằng đọc giá trị của một đối tượng sau khi di chuyển nó là UB. đây không phải là trường hợp à? –

+0

Nghĩ như vậy - tôi sẽ vô cùng ngạc nhiên nếu điều này không đúng, mặc dù các kiểu nguyên thủy chỉ để lại giá trị một mình là lựa chọn rẻ nhất rõ ràng (đối với các loại phức tạp mà họ không thể làm điều đó mặc dù tôi nghĩ?) – Voo

+0

Suy nghĩ của tôi cũng là nó sẽ là UB, ít nhất là cho POD (không có destructors). Đối với các POD không, tất nhiên chúng phải được thay đổi để tất cả các con trỏ có thể được đặt thành 0 để destructor sẽ không làm bất cứ điều gì ... – Emil

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