2012-05-10 31 views
5

Câu hỏi này có thể được xem là câu hỏi tiếp theo cho câu hỏi sau: C++ temporary variable lifetime.C++ - biến tạm thời và tuổi thọ của chúng

Qt vùng chứa hỗ trợ cú pháp khởi tạo stream-like. Bây giờ, khi tôi viết mã sau đây, QVector của tôi bị hủy ngay sau khi chuyển nhượng và tham chiếu trở nên lơ lửng.

const QVector<QString>& v = QVector<QString>() << "X" << "Y" << "Z"; 

Tương ứng operator<< được thực hiện theo cách sau:

inline QVector<T> &operator<< (const T &t) 
{ append(t); return *this; } 

Theo như tôi biết, 10.4.10 Temporary Objects khẳng định rằng thời gian tồn tại của một đối tượng tạm thời được mở rộng để phù hợp với cuộc đời của correspnding const tham chiếu đến nó.

Tuy nhiên, trong trường hợp này, đối tượng tạm thời QVector<QString>()bị hủy trước đó.

Tôi đoán rằng điều này có thể xảy ra do thực tế hoạt động cuối cùng trả về QVector<QString>& và không nên biết bất kỳ điều gì về tuổi thọ của QVector<QString> tạm thời, nhưng giải thích này không nghiêm ngặt và có thể sai.

Vì vậy, tại sao điều này lại xảy ra?

+3

"* Tôi đoán rằng có lẽ điều này xảy ra do ... * "Bạn nói đúng, nhưng lời giải thích kỹ thuật sẽ là một rvalue đang phân rã thành một giá trị. – ildjarn

+0

Tôi nghĩ, 'tạm thời' bị ràng buộc với tham chiếu * trả về * của toán tử * << * nhưng ở cuối' biểu thức' nó bị hủy. Tiêu chuẩn này chỉ đảm bảo 'tạm thời' ràng buộc với thời gian sống của * const ref *, không phải' các tham chiếu tạm thời' ràng buộc với chúng. –

+0

Tôi nhận ra câu hỏi của bạn thỏa mãn tò mò về mặt học thuật, nhưng thực tế, bạn chỉ có thể làm cho 'v' không tham chiếu như sau:' const QVector v = QVector () << "X" << "Y" << " Z ";' –

Trả lời

7

Thời gian tồn tại của một tạm thời chỉ được mở rộng nếu nó được ràng buộc với một const tham khảo:

const QVector<QString>& v = QVector<QString>(); 

Tuy nhiên, trong mã của bạn, bạn là không ràng buộc tạm thời để bất cứ điều gì. Thay vào đó, bạn đang gọi một hàm thành viên (của tạm thời), trả về một tham chiếu (tới tạm thời). Kết quả của cuộc gọi hàm này không còn là một đối tượng tạm thời, mà chỉ là một tham chiếu đơn giản. Đối tượng tạm thời ban đầu hết hạn vào cuối biểu thức đầy đủ mà nó xuất hiện và tham chiếu v trở nên lơ lửng.

(Trong mới C++, có thể để ngăn cấm "tai nạn" như vậy nhờ chức năng thành viên rvalue-đủ điều kiện, tức là bạn có thể =delete phiên bản rvalue của người điều khiển <<.)

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