2012-07-02 37 views
5

Tôi nghĩ rằng đoạn mã sau sẽ tạo ra một lỗi:Chuyển đổi từ const char * để std :: string const &

#include <iostream> 
#include <string> 

static void pr(const std::string &aStr) 
{ 
    std::cout << aStr << "\n"; 
} 

int main(void) 
{ 
    const char *a = "Hellu"; 

    pr(a); 

    return 0; 
} 

Nhưng gcc 4.1.2 biên dịch nó successuflly.

Có phải đó là hàm tạo của std :: string nhận được trong cách, tạo ra một thể hiện của std :: string?

Tôi tin là không nên, bởi vì tham chiếu chỉ là một bí danh cho một biến (trong trường hợp này, không có biến kiểu std :: chuỗi tham chiếu đang đề cập đến).

Có ai ở đó để giải thích lý do mã biên dịch thành công không?

Xin cảm ơn trước.

Trả lời

10

Có, được tham chiếu đến số hằng số, trình biên dịch có thể/sẽ tổng hợp tạm thời (trong trường hợp này là loại std::string) và liên kết tham chiếu đến tạm thời đó. Tuy nhiên, nếu tham chiếu không phải là một đối tượng const, nó sẽ không hoạt động - chỉ một tham chiếu đến const có thể liên kết với một đối tượng tạm thời như vậy (mặc dù trình biên dịch được sử dụng rộng rãi nhất cho phép tham chiếu không const cũng liên kết với tham chiếu).

+0

Interststing sự kiện. Một là học tập hàng ngày;). Tôi đã không nhận được câu thứ hai của bạn mặc dù. Bạn có nghĩa là nếu tiêu đề chức năng sẽ là 'void pr (std :: string & aStr)' xây dựng một tạm thời (bằng cách ngụ ý) là không thể bởi standart? – Paranaix

+0

@Paranaix: Đúng - 'pr (std :: string &)' sẽ không thể chấp nhận đối tượng tạm thời. –

+0

@JerryCoffin, sau đó, có cách nào để giữ trình biên dịch không tạo ra một cá thể tạm thời không? – orchistro

2

Điều bạn gặp phải là chuyển đổi tiềm ẩn.

Dưới đây là một trích dẫn từ C++ Standard (SC22-N-4411.pdf)

1 Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions (Clause 4), for initialization (8.5), and for explicit type conversions (5.4, 5.2.9).

Vì vậy, trình biên dịch chỉ hoạt động như mong muốn và kêu gọi các nhà xây dựng std::string bạn đề cập đến.

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