2013-02-04 11 views
15

Cân nhắc this mã:Các loại tích hợp có chuyển ngữ nghĩa không?

#include <iostream> 
using namespace std; 

void Func(int&& i) { 
    ++i; 
} 

int main() { 
    int num = 1234; 
    cout << "Before: " << num << endl; 
    Func(std::move(num)); 
    cout << "After: " << num << endl; 
} 

đầu ra của nó là:

Before: 1234 
After: 1235 

Rõ ràng, i đang được sửa đổi trong Func, vì nó là ràng buộc để tham số i sau khi được "chuyển đổi" để một r-giá trị tham chiếu của std::move.

Vâng, quan điểm của tôi:

Di chuyển một đối tượng có nghĩa là chuyển quyền sở hữu các nguồn lực từ một đối tượng vào một. Tuy nhiên, các loại được cài sẵn giữ không có tài nguyên nào bởi vì chính chúng là tài nguyên. Nó không có ý nghĩa để chuyển các tài nguyên mà họ nắm giữ. Như được hiển thị trong ví dụ, giá trị của num được sửa đổi. Tài nguyên của nó, bản thân nó, là tài nguyên đang được sửa đổi.

Các loại tích hợp có chuyển ngữ học không?

Ngoài ra, hãy tạo các đối tượng kiểu dựng sẵn sau khi nó được di chuyển (nếu có) một hành vi được xác định rõ?

+1

Theo những gì? >> * "Di chuyển một đối tượng có nghĩa là chuyển quyền sở hữu tài nguyên từ một đối tượng vào nhau. Điều đó có thể rời khỏi (nguồn) đối tượng ban đầu trong tình trạng không xác định, nơi phân có thể là chỉ hoạt động an toàn và hiệu lực mà có thể được sử dụng trong đối tượng đó. Bất kỳ hoạt động nào đọc nội dung của các đối tượng đó đều có thể trả về các giá trị không xác định. "* – Nawaz

+0

@Nawaz Theo những gì tôi đã đọc trong SO. –

+3

'std :: move' không di chuyển. Ví dụ của bạn không có một chuyển động duy nhất giữa các kết quả đầu ra. –

Trả lời

37

Và như vậy, liệu điều này có được thể hiện bằng ví dụ về hành vi được xác định rõ không?

Có, hành vi được hiển thị trong ví dụ là hành vi duy nhất được phép theo tiêu chuẩn. Đó là bởi vì std::move không di chuyển. Những thứ di chuyển là di chuyển các nhà xây dựng và di chuyển các toán tử gán.

Tất cả std::move thực hiện thay đổi một giá trị thành một xvalue, sao cho nó có thể liên kết với các tham chiếu rvalue. Nó không gọi bất kỳ nhà xây dựng nào hay bất cứ thứ gì khác. Thay đổi danh mục giá trị xảy ra ở cấp loại. Không có gì xảy ra khi chạy.

tài liệu tham khảo rvalue vẫn là tài liệu tham khảo: họ đề cập đến đối tượng gốc. Hàm tăng số nguyên ban đầu thông qua tham chiếu đã cho.

Nếu một hàm lấy đối số bằng tham chiếu, không có bản sao cũng không di chuyển xảy ra: đối tượng ban đầu được ràng buộc với tham chiếu.

Nếu một hàm lấy đối số theo giá trị, thì chúng tôi có thể sẽ chuyển.

Tuy nhiên, các loại cơ bản không có nhà thầu di chuyển. Di chuyển xuống cấp để sao chép trong trường hợp đó.

+2

+1 Câu trả lời hay. – Nawaz