2015-10-12 15 views
6

Điều này được thừa nhận là một câu hỏi khó tính mà chủ yếu là do tò mò. Giả sử chúng ta có những điều sau đây:Điều gì sẽ xảy ra khi bạn chỉ định hằng số theo nghĩa đen cho tham chiếu rvalue?

int x = 5; 
int&& xref = std::move(x); 
std::cout << "Before assignment x: " << x << std::endl; 
std::cout << "Before assignment xref: " << xref << std::endl; 
xref = 10; 
std::cout << "After assignment x: " << x << std::endl; 
std::cout << "After assignment xref: " << xref << std::endl; 

Kết quả như mong đợi là:

// Before assignment x: 5 
// Before assignment xref: 5 
// After assignment x: 10 
// After assignment xref: 10 

này có ý nghĩa. std::move chuyển đổi x thành xvalue và cho phép chúng tôi liên kết vị trí bộ nhớ của nó với xref và sửa đổi nội dung của nó cho phù hợp. Bây giờ cho phép nói rằng chúng ta có những điều sau đây:

int&& xref = 5; 
std::cout << "Before assignment xref: " << xref << std::endl; 
xref = 10; 
std::cout << "After assignment xref: " << xref << std::endl; 

int x = 5; 
std::cout << "After assignment x: " << x << std::endl; 

Đầu ra là bằng trực giác:

// Before assignment xref: 5 
// After assignment xref: 10 
// After assignment x: 5 

này có ý nghĩa tổng thể. Chúng tôi hy vọng có thể liên kết chữ số hằng số 5 thành xref5 là giá trị chính xác. Chúng tôi cũng hy vọng rằng xref có thể thay đổi. Chúng tôi cũng hy vọng rằng giá trị của hằng số theo nghĩa đen 5 không thể sửa đổi được (như được hiển thị phần nào về mặt đạo đức trong hai dòng cuối cùng của đoạn mã trên).

Vì vậy, câu hỏi của tôi là, chính xác những gì đang xảy ra ở đây? Làm thế nào để C++ biết không sửa đổi giá trị của hằng số chữ 5 nhưng duy trì danh tính đầy đủ cho xref để biết rằng nó đã được thay đổi thành 10 bằng cách gán. Biến mới có được tạo khi gán cho xref khi biến được liên kết với một hằng số không? Câu hỏi này không bao giờ xuất hiện trong C++ 03 vì chỉ có các tham chiếu const có thể bị ràng buộc với các giá trị.

Trả lời

4

Tạm thời được xây dựng, được khởi tạo từ giá trị của chữ, và nó kéo dài miễn là tham chiếu. Bạn có thể làm những gì bạn thích với đối tượng này.

Về mặt đời, điều này cũng giống như khi bạn viết const int& x = 5; chỉ, có, thực tế là bạn đang làm việc với một đối tượng tạm thời được tạo tự động bị che dấu bởi vì const ngăn bạn chứng minh nó bằng một đột biến.

[C++14: 8.5.3/5]:[..] Nếu T1 là một loại phi giai cấp, tạm thời kiểu “CV1T1” được tạo ra và sao chép-khởi (8,5) từ biểu thức khởi tạo. Tham chiếu sau đó được liên kết với tạm thời. [..]

+1

Cảm ơn. Điều này trả lời câu hỏi của tôi và mọi câu hỏi tiếp theo tôi sẽ có. – Klam

+0

@Klam: Tất cả các phần của dịch vụ tại Lightness Industries. –

5
int&& xref = 5; 

... tạo ra một tạm thời, khởi tạo với 5, có tuổi thọ được kéo dài đến hết khối.

Việc chuyển nhượng

xref = 10; 

thay đổi giá trị của vẫn sống tạm thời.

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