2012-03-08 33 views
11

thể trùng lặp:
Global const string& smells bad to me, is it truly safe?bất cứ ai có thể giải thích này sử dụng C++ tham khảo

Tôi đã tình cờ đoạn mã sau và tự hỏi theo căn cứ nào

std::string const & thestring("XYZ"); 

Đó là thực tế là nó đang xây dựng đối tượng và đề cập đến nó bằng một tham chiếu. Tôi đã từng thấy

std::string const theString("XYZ"); 

và tự hỏi sự khác biệt là gì. Tôi khá hạnh phúc vì đối tượng sẽ không bị phá hủy sớm khi vật thể sống trên ngăn xếp cùng với tham chiếu.

+0

Không bao giờ thấy trường hợp 1, có vẻ như đó là vô nghĩa. Xây dựng một tạm thời và liên kết một tham chiếu const với nó (do đó kéo dài tuổi thọ đến phạm vi tham chiếu). Trường hợp thứ hai là 1 độ ít hơn, và sẽ cho tất cả các mục đích ý định hành động như trường hợp một. Nhưng có lẽ tôi đang thiếu một cái gì đó không rõ ràng. – Ylisar

+2

Điều này có vẻ liên quan: http://stackoverflow.com/a/1028511/390913 – perreal

+0

Sự khác biệt duy nhất tôi có thể nghĩ là không tham chiếu một được khai báo là const, và do đó const đúc đi constness là UB – PlasmaHH

Trả lời

0

phụ thuộc hoàn toàn vào những gì đang xảy ra với chuỗi có chức năng. Nó cần phải được lưu để được tham chiếu.

nếu bạn có một biến trong hàm đang tồn tại, hãy nói đối tượng mà hàm đó thuộc về.

class yourClass { 
    string a; 

    string const & yourFunction(string b) { 
     a = b; 
     return a; 
    } 
} 

Ngoài ra, không quá chắc chắn những gì sẽ xảy ra nếu bạn chỉ sẽ trở lại "someString" directy, nhưng khi bạn làm một điều tương tự với inparameters nó hoạt động như thế này:

void test(const string& value); 

Nếu bạn sau đó sẽ vượt qua "someString" nó sẽ không được xử lý như một tham chiếu, chỉ là một giá trị. Nếu bạn loại bỏ "const" bạn sẽ gặp rắc rối và sẽ không thể chuyển "someString" làm giá trị.

+0

Tôi nghĩ rằng sự hiểu biết của bạn về tham chiếu const là một chút mờ (hoặc có lẽ không grealy worded).Một tạm thời có thể bị ràng buộc với một biến 'const &' hoặc tham số hàm, trong trường hợp này, thời gian tồn tại của tạm thời được kéo dài đến tham chiếu của tham chiếu. Tuy nhiên điều này không làm việc với các giá trị trả về hoặc thuộc tính lớp, vì vậy bạn cần một đối tượng được đặt tên ở đó. –

+0

ofc i có thể được ràng buộc với một const &, chỉ cần ment rằng bạn có thể vượt qua một chuỗi đồng bằng như inparameter khi bạn xác định nó như const & nhưng không chỉ & .. sửa tôi nếu im sai. và ý bạn là gì về điều cuối cùng? không chắc chắn nếu tôi hiểu những gì bạn có nghĩa là có – chikuba

+0

Tôi có nghĩa là nếu bạn sử dụng một thuộc tính đó là một 'std :: string const &' trong một lớp, bạn không thể ràng buộc một chuỗi tạm thời với nó. –

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