2012-03-06 37 views
6

thể trùng lặp:
Does a const reference prolong the life of a temporary?Điều gì sẽ xảy ra khi tôi gán một tham chiếu tạm thời cho tham chiếu const trong C++?

để nói rằng tôi có một chức năng f:

int f(int x){return x;} 

const int &a=f(1); 

Tôi biết rằng f(1) chỉ là tạm thời và tôi sẽ bị phá hủy sau tuyên bố này, nhưng

  1. làm cho tham chiếu const sẽ cho f (1) một cuộc sống lâu dài?
  2. nếu có, trong đó f(1) sẽ được lưu trữ?
  3. và điều đó có nghĩa là x cũng không bị phá hủy khi hết phạm vi?
  4. sự khác biệt giữa f(1)x là gì?
+0

Bạn cần một cuốn sách C++ tốt. Xem http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

+4

@Ben Rất ít (thậm chí tốt) sách bìa này. –

+0

@Konrad: Có lẽ anh ấy đang đề cập đến câu hỏi cuối cùng ... –

Trả lời

8

Bạn đang bối rối với các giá trị.

1) Tuổi thọ của giá trị tạm thời được trả về bởi biểu thức f(1) sẽ kéo dài tuổi thọ của nó. Quy tắc này là duy nhất cho các tham chiếu const.

2) Bất cứ nơi nào trình biên dịch muốn, nhưng có thể trên ngăn xếp.

3) Có thể. Nó phụ thuộc vào việc trình biên dịch sao chép x hoặc thực hiện sao chép bản sao. Vì loại này là int, điều đó không quan trọng.

4) Rất nhiều sự khác biệt. Một là tên của một biến cục bộ bên trong int f(int). Nó là một giá trị. Cách khác là biểu thức gọi số int f(int) và đánh giá thành giá trị.

+0

: Tôi biết rằng biểu thức trả về giá trị, nhưng làm thế nào các giá trị này được lưu trữ trong f (1), trình biên dịch chỉ đơn giản là gán f (1) đến 1 như thế này: int f (1) = 1 ; hoặc cái gì khác? – AlexDan

2

Ràng buộc tạm thời thành const& kéo dài tuổi thọ của thời gian tham chiếu.

+0

nếu nó kéo dài tuổi thọ của tạm thời, sau đó nơi f (1) được lưu trữ và nó có địa chỉ riêng của nó và có thể được thay đổi như biến bình thường? – AlexDan

+0

@AbdessamadBond Cho dù nó có thể được thay đổi như một biến bình thường là (tôi nghĩ) một câu hỏi mở; bạn cần một 'const_cast' để có thể thay đổi nó, và thậm chí sau đó, kết quả có thể là hành vi không xác định. (Tôi nghĩ rằng mục đích là họ là hành vi không xác định, nhưng tôi không chắc chắn rằng từ ngữ yêu cầu điều này thực sự xuất hiện trong tiêu chuẩn.) –

+0

@JamesKanze Trường hợp duy nhất UB có thể được gây ra bởi một 'const_cast' là nếu đối tượng đã được khai báo 'const'. Theo như tôi thấy, đây không phải là trường hợp tạm thời. – pmr

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