Tôi có một vài câu hỏi mà tôi nghĩ sẽ khá dễ dàng đối với người có trải nghiệm C++ để trả lời, tôi sẽ in đậm quesitons cho TL; DRC-Style strings to std :: làm rõ chuỗi chuyển đổi
với đoạn mã sau:
void stringTest(const std::string &s)
{
std::cout << s << std::endl;
}
int main()
{
stringTest("HelloWorld");
}
Hopefuly ai đó có thể chỉ ra những sai sót trong quá trình suy nghĩ của tôi ở đây:
tại sao tham số trong stringTest đã được đánh dấu const khi đã thông qua một chuỗi C-Style? Không có chuyển đổi ẩn đối với chuỗi std :: diễn ra bằng cách sử dụng hàm tạo chuỗi cstyle của nó, do đó "s" không còn là tham chiếu đến một chữ (và không bắt buộc phải là const).
Hơn nữa, điều gì sẽ một chuỗi cstyle constructor cái nhìn như thế nào, và làm thế nào để trình biên dịch biết để gọi này khi nhìn thấy:
stringTest("HelloWorld");
Liệu nó chỉ đơn giản là nhận ra một chuỗi chữ là một cái gì đó giống như một char * ?
Tôi đã tình cờ gặp những câu hỏi này trong khi nghiên cứu các nhà thầu sao chép. Một quesiton nhanh chóng làm rõ của riêng tôi ...
Trong trường hợp của một cái gì đó như:
std::string s = "HelloWorld";
là các nhà xây dựng chuỗi cstyle sử dụng để nhanh chóng một std :: string tạm thời, và sau đó là chuỗi tạm thời là sao chép vào "s" bằng cách sử dụng constructor chuỗi sao chép?:
std::string(const std::string&);
"Tại sao tham số trong stringTest phải được đánh dấu const" - bất kể khi nào _necessary_, bạn muốn tạo tham chiếu _all_ 'const' không thực sự được sửa đổi. – leftaroundabout
@leftaroundabout: Điểm công bằng, tôi chắc chắn sẽ làm điều này với trái tim. – Riken
có thể trùng lặp của [Làm thế nào đến một tham chiếu không const không thể liên kết với một đối tượng tạm thời?] (Http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to -a-tạm thời-đối tượng) –