2012-01-26 36 views
5

Cho phép có một cái nhìn đến hai chức năng này:Đối tượng tạm thời có bị xóa nếu không có tham chiếu const nào không?

std::string get_string() 
{ 
    std::string ret_value; 
    // Calculate ret_value ... 
    return ret_value; 
} 

void process_c_string(const char* s) 
{ 
    std::cout << s << endl; 
} 

Và đây là hai cuộc gọi có thể có của process_c_string với lập luận được trả về bởi get_string.

  1. Nếu không có ràng buộc const tham chiếu đến đối tượng trả về get_string.

    process_c_string(get_string().c_str()); 
    
  2. Với tham chiếu const ràng buộc đối tượng trả về get_string.

    const std::string& tmp_str = get_string(); 
    process_c_string(tmp_str.c_str()); 
    

Tôi biết rằng Cách thứ hai là hợp lệ, nhưng những gì về người đầu tiên, những gì hiện tiêu chuẩn nói về trường hợp này? Liệu đối tượng tạm thời trả về trước get_string có bị xóa trước khi process_c_str kết thúc vì không có const reference đối với nó không?

Lưu ý: Cả hai phiên bản đều ổn trong MSVC.

Trả lời

6

Vòng đời tạm thời kéo dài cho độ dài của biểu thức đầy đủ mà nó được tạo ra. Trong trường hợp của bạn, tạm thời sẽ bị hủy nhưng chỉ sau khi cuộc gọi đến process_c_string hoàn tất. Miễn là chức năng không lưu trữ con trỏ để sử dụng sau này, bạn vẫn ổn.

Trong trường hợp thứ hai (ràng buộc tham chiếu), thời gian tồn tại tạm thời được mở rộng là phạm vi của tham chiếu, nhưng tôi khuyên bạn nên chống lại mẫu đó trong trường hợp cụ thể này. Bạn nhận được cùng một hiệu ứng bằng cách tạo ra một chuỗi địa phương khởi tạo với tạm thời và mã đơn giản hơn. (Từ quan điểm hiệu năng, tất cả các trình biên dịch sẽ tách biệt bản sao thêm tiềm năng trong mã, vì vậy chi phí sẽ giống nhau)

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