Tôi hiện đang xem xét một số mã có thể được biên dịch trên các phiên bản mới hơn của GCC chứ không phải trên các phiên bản cũ hơn. Trong trường hợp của tôi, tôi đang sử dụng một số std::back_inserter
đến std::copy
một số dữ liệu từ một cấu trúc dữ liệu đến cấu trúc dữ liệu tùy chỉnh. Tuy nhiên, nếu tôi quên kiểu gõ typedef value_type & const_reference
trong cấu trúc dữ liệu tùy chỉnh này, thì điều này sẽ không biên dịch trên GCC 4.4. Cùng một mã biên dịch và chạy tốt trên GCC 4.5.std :: back_inserter cần const_reference trên GCC cũ hơn. Tại sao?
Sự khác biệt giữa hai phiên bản trình biên dịch này, điều đó làm cho mã biên dịch trên một phiên bản nhưng không biên dịch trên phiên bản khác. Tôi đoán nó có một cái gì đó để làm với việc thực hiện C + + 11 được hoàn thành ít hơn nhiều trong GCC 4.4. Có lẽ một cái gì đó với decltype
hoặc một từ khóa C++ 11 mới, tôi đoán vậy.
Mã này cũng đúng, nếu tôi sử dụng std::back_inserter
mà không xác định loại const_reference
? Tôi thường nghĩ rằng người ta phải thực hiện đầy đủ các typedefs (value_type
, reference
, const_reference
vv) để tương thích với thư viện thuật toán STL? Hoặc tôi có thể giả định một cách an toàn rằng nếu mã của tôi biên dịch trong trường hợp này, tôi không gọi bất cứ điều gì nguy hiểm (ví dụ: di chuyển ngữ nghĩa, mà sẽ phá hủy cơ sở hạ tầng khác của tôi).
Để ghi lại (để giúp người mới bắt đầu như tôi tiết kiệm thời gian): Sau khi tôi thêm 'typedef T & tham chiếu; typedef const T & const_reference; ' vào cấu trúc dữ liệu của tôi, lỗi c2039 cho back_inserter đã biến mất. –