Hãy xem xét các chương trình đơn giản dưới đây, mà cố gắng để lặp qua các giá trị của một bộ sử dụng tài liệu tham khảo NON-const đến các yếu tố trong đó:Tại sao std :: set có vẻ ép buộc sử dụng bộ const_iterator?
#include <set>
#include <iostream>
class Int
{
public:
Int(int value) : value_(value) {}
int value() const { return value_; }
bool operator<(const Int& other) const { return value_ < other.value(); }
private:
int value_;
};
int
main(int argc, char** argv) {
std::set<Int> ints;
ints.insert(10);
for (Int& i : ints) {
std::cout << i.value() << std::endl;
}
return 0;
}
Khi biên dịch này, tôi nhận được một lỗi từ gcc:
test.c: In function ‘int main(int, char**)’:
test.c:18:18: error: invalid initialization of reference of type ‘Int&’ from expression of type ‘const Int’
for (Int& i : ints) {
^
Có, tôi biết tôi không thực sự cố gắng sửa đổi các phần tử trong vòng lặp for. Nhưng vấn đề là tôi sẽ có thể có được một tham chiếu không const để sử dụng bên trong vòng lặp, vì bản thân thiết lập không phải là const đủ điều kiện. Tôi nhận được cùng một lỗi nếu tôi tạo một hàm setter và sử dụng nó trong vòng lặp.
Tôi đã giải thích điều này một cách chi tiết, ở đây: [lỗi: đi xxx như 'này' đối số của vứt bỏ xxx vòng loại] (http://stackoverflow.com/questions/ 5923427/error-passing-xxx-as-this-argument-of-xxx-discards-qualifiers) – Nawaz
Nếu bạn thực sự muốn thay đổi một phần tử của 'std :: set', tại chỗ, bạn có thể sử dụng' const_cast'. Chỉ cần chắc chắn _ rằng sửa đổi không thay đổi thứ tự của phần tử trong tập hợp hoặc bạn sẽ chạy vào hành vi không xác định. Điều này là rất không an toàn, đó là lý do tại sao bạn phải đi _way_ trên con đường của bạn để làm điều đó. – gnzlbg