2012-01-15 23 views
8

Mã đi dưới đây:vector <T> :: hoán đổi và đối tượng tạm thời

#include <vector> 

int main() 
{ 
    vector<int> v1(5,1); 
    v1.swap(vector<int>()); //try to swap v1 with a temporary vector object 
} 

Đoạn mã trên không thể biên dịch, lỗi:

error: no matching function for call to ‘std::vector<int, std::allocator<int> >::swap(std::vector<int, std::allocator<int> >)’ 

Nhưng, nếu tôi thay đổi mã để một cái gì đó như thế này, nó có thể biên dịch:

int main() 
{ 
    vector<int> v1(5,1); 
    vector<int>().swap(v1); 
} 

Tại sao?

Trả lời

9

vector<int>() là một số rvalue (tạm thời, gần như nói) và bạn không thể ràng buộc tham chiếu không phải là const với giá trị. Vì vậy, trong trường hợp này, bạn không thể chuyển nó đến một hàm lấy tham chiếu không phải là const.

Tuy nhiên, nó hoàn toàn tốt để gọi các hàm thành viên trên thời gian, đó là lý do tại sao ví dụ thứ hai của bạn biên dịch.

+0

Bạn có thể cung cấp thêm thông tin về "' vector () 'là một giá trị" không? 'rvalue' sẽ xuất hiện ở bên phải của' = ', phải không? – Alcott

+0

@Alcott: Nó tổng quát hơn thế. Xem http://en.wikipedia.org/wiki/Value_(computer_science). –

+0

Tôi thấy bài viết này rất hữu ích trong việc hiểu các giá trị: http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html – Adam

6

Cuộc gọi v1.swap(std::vector<int>()) cố gắng ràng buộc tạm thời (ví dụ: std::vector<int>()) với tham chiếu không phải const. Điều này là bất hợp pháp và thất bại. Mặt khác, việc sử dụng std::vector<int>().swap(v1) gọi hàm không const trên tạm thời [không const] được cho phép.

Trong C++ 2011 tôi đã nghĩ rằng việc khai báo sẽ được đổi thành std::vector<T>::swap(T&&) và do đó sẽ trở thành OK để sử dụng swap() với thời gian (nhưng, rõ ràng là vẫn không có đối tượng const). Như GMan đã chỉ ra đây không phải là trường hợp.

+1

Không, chỉ cần 'hoán đổi (T &) '. – GManNickG

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