2013-08-29 38 views
8

tôi nhận thấy rằng QMap::operator[](const Key & key) có hai overloads:Tại sao toán tử QMap :: [] (const Key & key) trả về theo giá trị?

T & QMap::operator[](const Key & key) 
const T QMap::operator[](const Key & key) const 

Có một lý do để trở về bằng giá trị?

Và kể từ khi chúng tôi có ngữ nghĩa di chuyển:

khi trở về giá trị, chúng ta nên bao giờ quay trở lại theo giá trị const?

Lý do tại sao tôi yêu cầu là:

Hãy tưởng tượng chúng ta có:

class ExpensiveToCopy; 
{ 
public: 
    int someProperty() const; 
    ... 
} 

void f(const QMap<int, ExpensiveToCopy>& map) 
{ 
    int lala = map[4].someProperty(); // We need to copy the entire object 
             // just to look at someProperty(); 
} 
+1

Chỉ * một * trả về quá tải theo giá trị, giá trị còn lại trả về tham chiếu. –

+2

@ Joachim Vâng, đó là điều mà tôi không hiểu. Không nên cả hai trở lại một tham chiếu như ví dụ std :: vector :: operator []? –

+1

@nurettin * * * ức chế di chuyển ngữ nghĩa. – juanchopanza

Trả lời

11

Trong trường hợp const chúng tôi không thể thêm một yếu tố để bản đồ const nếu nó không tồn tại , vì vậy một đối tượng địa phương sẽ được trả về.

Nếu không, trong trường hợp không phải const, một phần tử sẽ được tạo bằng khóa được chỉ định (nếu chưa có) trước khi trả về tham chiếu đến nó.

+3

Đây chính xác là nó. Tôi vừa viết câu trả lời tương tự. Lưu ý 'std :: map' không có' const operator [] ', và nó có lẽ là một điều tốt. Ít bối rối. – juanchopanza

+0

Cụ thể: trường hợp 'const' phải có khả năng trả về phần tử được tạo" mặc định "mà không chèn bất kỳ thứ gì vào bản đồ trong trường hợp không tìm thấy phần tử có khóa đã cho trong bản đồ. Vì vậy, nó không thể trả về một tham chiếu. – juanchopanza

+0

@juanchopanza Nó có thể trả về một tham chiếu đến một biến cục bộ tĩnh, vì vậy có thể trả về tham chiếu const. Cho dù ai muốn, là một vấn đề khác ... – Sjoerd

0

Tôi nghĩ rằng không tham chiếu const là để đảm bảo mã khách hàng không thể sửa đổi map bằng bất kỳ cách nào. bạn biết nếu sử dụng const_cast<ExpensiveToCopy>map[4] hoặc các cách khác, chúng tôi vẫn có thể sửa đổi map[4], nhưng điều này map[4] không tham chiếu đến yếu tố thứ 4 của map.

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