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?
"* 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
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. –
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 ";' –