2015-03-26 23 views
11

Một chuỗi chuỗi thường xuyên theo nghĩa đen có nghĩa sau đây:Tại sao trả về một tham chiếu đến một chuỗi ký tự một tham chiếu đến một tạm thời?

xâu thường và UTF-8 chuỗi literals cũng được gọi để xâu như hẹp. Một chuỗi ký tự hẹp có loại “mảng của n const char”, trong đó n là kích thước của chuỗi như được định nghĩa bên dưới, và có thời lượng lưu trữ tĩnh (3.7).

Tôi giả sử vì nó có thời lượng lưu trữ tĩnh và chúng thường được đặt trong ROM, nó thực sự không phải là một vấn đề lớn nếu có một tham chiếu lơ lửng với nó. Các mã sau đây phát ra một cảnh báo

const char* const & foo() 
{ 
    return "Hello"; 
} 
// warning: returning reference to temporary [-Wreturn-local-addr] 

Nhưng điều này là tốt, thậm chí không có từ khóa tĩnh

const char* const & foo() 
{ 
    const char* const & s = "Hello"; 
    return s; 
} 

Vì vậy, sự khác biệt giữa hai là gì?

+3

Mã của bạn không trả về tham chiếu đến chuỗi ký tự. Nó trả về một tham chiếu đến một con trỏ. Hầu hết những gì bạn trích dẫn là không liên quan đến mã. –

+2

Trích dẫn của bạn từ đâu? Bạn nên thêm nó. – dhein

+0

Tại sao bạn trả về một tham chiếu đến một con trỏ char thay vì chính con trỏ char? – CodesInChaos

Trả lời

8

Không có sự khác biệt. Trong cả hai trường hợp, bạn trả lại một tham chiếu đến một con trỏ không còn tồn tại nữa.

Rằng pointee (dữ liệu) vẫn tồn tại mãi mãi là không liên quan.

10

Các báo bạn đã đăng nói rằng

Một chuỗi hẹp theo nghĩa đen có kiểu “mảng của n const char”

Đó là, các loại "Hello"const char[6].

Mã của bạn đang trả lại tham chiếu đến const char *. Điều này có nghĩa là chuyển đổi mảng-sang-con trỏ phải được áp dụng cho chuỗi ký tự, dẫn đến giá trị prvalue (= tạm thời) của loại const char *. Sau đó, bạn liên kết điều này với tham chiếu và trả lại tham chiếu đó. Tham chiếu trở nên lơ lửng ngay khi phạm vi của hàm kết thúc và con trỏ tạm thời bị hủy.

2
const char* const & s = "Hello"; 

Ở đây biến được tạo ra trên stack ... và rằng biến (mà sẽ xảy ra là một con trỏ) điểm đến một vị trí bộ nhớ nơi mà các chuỗi literal được lưu trữ. Bạn đang không phải là trả về chính chuỗi chữ; bạn thay vì trả về tham chiếu đến biến sẽ bị phá hủy sớm do kết quả của việc giải quyết stack. Do đó việc trả về tham chiếu đến một biến như vậy là nguy hiểm, vì nó là một đối tượng tạm thời.

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