Tôi không chắc chắn ý nghĩa thực sự của const vector<int *>
vì vậy tôi đã biên dịch mã dưới đây để có được một ý tưởng nhưng bây giờ là bối rối hơn.Tại sao yếu tố không tham chiếu trong vector const của con trỏ int có thể thay đổi được?
vector<int *> v;
int x = 1, y = 2;
v.push_back(&x);
v.push_back(&y);
const vector<int *> w = v;
w[0] = &y; //failed. Element is a constant pointer?
*(w[0]) ++; //failed. Element pointer references to constant value?
Nếu tôi đã dừng lại ở đây, tôi sẽ giả định rằng const vector<int *>
là một vector của const int * const
, nhưng sau đó tôi đã cố gắng sau đó mâu thuẫn với giả định rằng rõ ràng.
*(w[0]) += 3; //passed. Value not constant?
*(w[0]) = 20; //passed. Why...
Bây giờ *(w[0])
vì lý do lạ lẫm với tôi rõ ràng là đối xử với ++
và +=
và phân công khác nhau. Tôi tự thuyết phục rằng const vector
chỉ khai báo một đối tượng không đổi của lớp vector
và kết quả trên có thể phụ thuộc vào việc thực hiện quá tải thực tế của lớp vector
. Nhưng tôi không thể quấn quanh đầu. Bất cứ ai có thể giúp giải thích, xin vui lòng?
Nếu nó có liên quan, tôi đã sử dụng g ++ 4.2 trên máy Mac.
Bạn có thể thấy điều này thú vị: Thay đổi bài đăng thành tiền gia tăng và xem điều gì xảy ra trên ví dụ về lỗi thứ hai. '++ * (w [0]);'. – WhozCraig
Tôi nghĩ rằng một nguồn lớn của sự nhầm lẫn là viết '* (w [0]) ++;' thay vì '(* w [0]) ++;' (mà tôi nghĩ là có khả năng là kết quả dự định). Ưu tiên của nhà điều hành có thể đôi khi hơi phức tạp. – Kat