Xcode đang thực hiện hoàn thành chính xác, nhưng đó không phải là những gì bạn mong đợi. Bạn đã tự mình trả lời câu hỏi một cách vô tình. Chức năng chữ ký cho string
's substr()
phương pháp, cũng giống như bạn nói, là:
string substr (size_t pos = 0, size_t n = npos) const;
Tất cả các đối số cho substr()
có nhiệm vụ mặc định, do đó để Xcode, s.substr()
(không có đối số) là việc hoàn thành mã hợp lệ để chèn vì nó là thực sựs.substr(0, s.npos)
. Bạn có thể xác nhận điều này với bất kỳ số lượng hàm C++ chuẩn nào với các đối số mặc định. Nơi dễ nhất để thấy điều này là với bất kỳ nhà xây dựng container STL nào.
Ví dụ: vector
. Chúng ta đều biết rằng vectors
có thể mất Allocator
, nhưng đối số mặc định được gán Allocator
là "đủ tốt" cho hầu hết các mục đích sử dụng thông thường. Chắc chắn, hai trong số những chữ ký cho vector
nhà xây dựng là:
explicit vector (const Allocator& = Allocator());
explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator());
Trong cả hai trường hợp, lập luận Allocator
có một nhiệm vụ mặc định, và trong lần thứ hai, giá trị mặc định T
có một nhiệm vụ mặc định. Bây giờ, hãy nhìn vào những gì Xcode gợi ý khi xây dựng một vector
:
Các gợi ý không có danh sách đối số là thực các nhà xây dựng mà chỉ mất một Allocator
. Đề xuất chỉ mất size_type
là thực sự là hàm tạo cần có một size_type
, T
và Allocator
.
Tùy thuộc vào cách bạn nghĩ về điều này, nó có thể hoặc không thể là lỗi Xcode. Lý tưởng nhất, bạn muốn xem các hoàn thành với các đối số mặc định cho các hàm đơn giản như substr()
, nhưng đối với các hàm tạo container STL, có thể bạn gần như không bao giờ muốn thấy chúng. Có lẽ nó có thể là một lựa chọn, nhưng tôi sẽ không mong đợi để thấy điều này sửa chữa. Dù vậy, tôi sẽ vui vẻ lừa một chiếc radar.
Tôi khá chắc chắn rằng điều tốt nhất bạn có thể làm tại thời điểm này là gửi báo cáo lỗi. – zneak