2012-05-10 45 views
7

Chỉ có trình biên dịch của tôi hoặc bị cấm sử dụng tham chiếu cons trong phần tử std :: vector. Xem xét sau cấu trúc:Tham chiếu Const trong std :: các phần tử vector

struct Y 
{ 
    const int & x; 

    Y(const int & p_x): 
     x(p_x) 
    { 
    } 
}; 

Bây giờ, khi tôi cố gắng đẩy đối tượng như vậy vào vector:

std::vector<Y> yv; 
int x = 5; 
Y y(x); 
yv.push_back(y); 

tôi nhận được lỗi biên dịch: "Lỗi: thành viên tham khảo không tĩnh 'const int & Y :: x ', không thể sử dụng toán tử gán mặc định ". Không nên sao chép ctor là đủ?

Trả lời

19

Các thành phần vector phải được gán. Từ phần 23.2.4 Lớp mẫu vector của chuẩn C++:

...the stored object shall meet the requirements of Assignable.

+2

+1 để trích dẫn tiêu chuẩn :) – Nobody

4

Không, bởi vì bạn không thể gán cho một tham chiếu const và các container STL sử dụng nhiệm vụ để di chuyển các mục xung quanh.

Bạn nên sử dụng shared_ptr (boost:: hoặc std:: tùy thuộc vào môi trường của mình) hoặc một con trỏ thô.

1

Một toán tử gán là cần thiết bởi vì vector mặc định xây dựng các phần tử trong các vùng bổ sung trước thời hạn.

Sau đó, thay vì tái phân bổ, nó sử dụng toán tử gán để gán các cá thể mặc định đó cho bất kỳ thứ gì bạn đẩy vào vectơ.

0

Thường bị cấm sử dụng các tham chiếu trong bất kỳ vùng chứa nào. Bạn có thể biện minh cho điều này bằng thực tế, rằng một vectơ ví dụ phân bổ dữ liệu trong forehand và các tham chiếu chỉ có thể được gán một lần (trong khi khởi tạo).

11

Bạn có thể muốn kiểm tra

std::reference_wrapper 

sẵn với C++ 11

+1

Hoặc tôi tin rằng 'boost :: reference_wrapper' cho pre C++ 11 – Nick

+0

Đây là một câu trả lời hữu ích nhưng nó sẽ được hưởng lợi từ một số giải thích/ví dụ về những gì' std :: reference_wrapper 'và cách nó được sử dụng. – luator

-1

Cuối cùng tôi sử dụng

std::vector< const Type* > 

Một chút không đẹp nhưng làm cùng một công việc.

Các vấn đề liên quan