2013-02-27 20 views
9
  • danh sách end() trả về bản sao của trình lặp vòng lặp kết thúc, phải không?
  • Do đó, list.end() là giá trị đúng, phải không?
  • - toán tử-hàm bị quá tải cho trình vòng lặp danh sách có tham chiếu không phải const, phải không?
  • bạn không thể liên kết giá trị với tham chiếu không phải const, phải không?

Vì vậy, làm thế nào mà khôngtại sao --list.end() biên dịch?

std::list<int> lst; 
// ... 
--l.end();` 

biên dịch?

Như được chỉ ra một cách chính xác, điểm thứ ba của tôi không nhất thiết phải đúng. Nhưng sau đó làm thế nào về mã này cũng biên dịch?

struct A{}; 

void f(A&) 
{ 

} 
A a() 
{ 
    return A(); 
} 

int main() 
{ 
    f(a()); 
} 
+2

Điểm thứ ba là sai. – Nawaz

+0

@banuj: Tôi không hiểu –

+0

Tôi không đồng ý rằng ví dụ thứ hai của bạn biên dịch: http://ideone.com/V98wW3 –

Trả lời

12
  • sự - điều hành chức năng quá tải cho danh sách iterator mất một tham chiếu không const, phải không?

Điểm này là sai. operator-- là một hàm thành viên, và một hàm thành viên có thể được gọi trên một tạm thời. Bạn không truyền bất kỳ đối tượng nào cho hàm thành viên này làm đối số. do đó, câu hỏi của rvalue ràng buộc để tham chiếu không const không phát sinh ở nơi đầu tiên.


Đối với các chỉnh sửa (đi qua rvalue-f(A&){}), nó là một phần mở rộng không chuẩn. Tôi đoán bạn đang sử dụng Microsoft Compiler, bởi vì tôi biết nó có phần mở rộng không chuẩn này là ngu ngốc theo ý kiến ​​của tôi.

+0

Oh ... đúng :) Tôi ngớ ngẩn. Phần còn lại của logic là âm thanh thouhg, phải không? :) –

+0

Btw, có phải là tiêu chuẩn bắt buộc - là một thành viên? Hoặc là nó được thực hiện xác định? –

+0

Thực ra nó không nhất thiết phải là chức năng của thành viên. Trình lặp có thể là một con trỏ. –