Gần đây tôi đã gặp phải sự cố kỳ lạ khi tôi nhận được const_iterator
thay vì số iterator
được mong đợi khi lặp qua nhiều lần. Hóa ra là một vấn đề không cho MSVC nhưng g ++ đã cho tôi một lỗi:C++ Tiêu chuẩn: Trình cố định không mong đợi trong multiset
error: invalid initialization of reference of type 'myPtr&' from expression of type 'const boost::shared_ptr'
đang liên quan:
typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
{
myPtr &mine = *i; // g++ problem here, not for MSVC
// const myPtr &mine = *i; works fine for g++
mine->tick(dt);
}
}
Khá một chút nghiên cứu tiết lộ rằng là một vấn đề với rất nhiều cuộc thảo luận trước đó . Tôi tìm thấy những bit có liên quan:
- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14990
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528
kiến thức cơ bản của tôi và nắm bắt về vấn đề này còn hạn chế và do đó tôi muốn muốn biết liệu tiêu chuẩn không định nghĩa điều này hành vi đủ tốt trong trường hợp g ++ và MSVC thực hiện hành vi theo ý thích của chúng hoặc cho dù g ++ hoặc MSVC đi chệch khỏi một tiêu chuẩn được xác định rõ.
Xin cảm ơn trước.
thay đổi các decl của 'tôi' cho 'const myPtr & mine'. Tất nhiên, 'tick' sẽ phải được khai báo 'void tick (float) const;' và bất kỳ thành viên dữ liệu nào được sửa đổi bằng tick sẽ cần phải là 'mutable'. – KitsuneYMG