2009-04-17 48 views
9

Sau khi đọc this article trên blog của Herb Sutter, tôi đã thử nghiệm một chút và gặp phải một điều gì đó khiến tôi lo lắng. Tôi đang sử dụng Visual C++ 2005, nhưng tôi sẽ ngạc nhiên nếu điều này đã được thực hiện phụ thuộc.Tham chiếu Const đến tạm thời

Đây là mã của tôi:

#include <iostream> 

using namespace std; 

struct Base { 
    //Base() {} 
    ~Base() { cout << "~Base()" << endl; } 
}; 

int main() 
{ 
    const Base & f = Base(); 
} 

Khi chạy, nó sẽ hiển thị "~Base()" hai lần ... Nhưng nếu tôi bỏ bình luận các nhà xây dựng, nó sẽ hiển thị nó chỉ lần!

Có ai có giải thích về điều này không?

Trả lời

24

Phụ thuộc triển khai IS này phụ thuộc.

Tiêu chuẩn cho phép sao chép xảy ra khi liên kết một tham chiếu tạm thời với tham chiếu const. Trong trường hợp của bạn, VC++ thực hiện một bản sao chỉ khi hàm tạo được định nghĩa ngầm định. Điều này là bất ngờ, nhưng được cho phép.

C++ 1x will fix this.

+0

Câu trả lời tuyệt vời, cảm ơn rất nhiều Sir :) – Drealmer

+0

Thú vị. Điều này có dẫn đến việc cắt đối tượng trong một số trường hợp không? –

+0

"C++ 1x sẽ sửa lỗi này". Ôi trời ơi, có phải đó là điều họ đang gọi là tiêu chuẩn tiếp theo bây giờ hay đây là một trò đùa dí dỏm? – veefu

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