5

Trong ví dụ sau, chức năng chuyển đổi nào nên được gọi? Tại sao người ta nên chọn người kia?Nếu toán hạng đầu tiên của biểu thức phụ có thể chuyển đổi thành cả con trỏ và số nguyên, thì chuyển đổi nào được chọn?

struct A 
{ 
    operator int(); 
    operator int*(); 
}; 

A x; 
int i = x + 1; 

Trình biên dịch chọn operator int() .. nhưng tại sao?

Dưới đây là một số trích dẫn có liên quan từ C++ 03:

Từ [expr.add]

Trường hợp bổ sung, hoặc cả hai toán hạng sẽ có số học hoặc kiểu liệt kê, hoặc một toán hạng sẽ là con trỏ đến một loại đối tượng được xác định hoàn toàn và loại kia phải có kiểu tách rời hoặc kiểu liệt kê.

Từ [conv]

biểu thức với một loại nhất định sẽ được ngầm chuyển đổi sang loại khác trong một số trường hợp:

  • Khi sử dụng như toán hạng của các nhà khai thác. yêu cầu của nhà điều hành cho toán hạng của nó ra lệnh kiểu đích
+2

Tôi cho rằng điều này sẽ không rõ ràng. Tôi không * nghĩ rằng * con trỏ không có gì đặc biệt hơn. – chris

+0

Liệu nó có gọi người khác nếu bạn nói 'int * i = x + 1;'? – John

+0

@ John, Không, nó chỉ than phiền về 'int -> int *'. – chris

Trả lời

9

Lý do cho hành vi này là được xây dựng trong điều hành mà chấp nhận một con trỏ như toán hạng trái của nó chấp nhận một đối tượng kiểu std::ptrdiff_t như toán hạng bên phải của nó . Đây là quy định tại § 13,6 của C++ 11 Tiêu chuẩn:

Đối với mỗi cv-đủ điều kiện hoặc không đủ điều kiện cv-loại đối tượng T có tồn tại các chức năng điều hành ứng cử viên có dạng

T * operator+(T *, std::ptrdiff_t); 

[.. .]

Kể từ 1 có kiểu int, trình biên dịch coi được xây dựng trong operator + mà phải mất hai int s như một lựa chọn tốt hơn, bởi vì nó đòi hỏi một onlys conver (người dùng định nghĩa) sion cho đối số đầu tiên.

Nếu bạn cung cấp một đối số kiểu std::ptrdiff_t là toán hạng bên hữu operator +, bạn sẽ thấy sự mơ hồ mong đợi:

int i = x + static_cast<std::ptrdiff_t>(1); // AMBIGUOUS! 

Đây là một live example.

+0

Cuộc gọi tốt. Ở đâu nó chỉ định rằng độ phân giải quá tải nên được sử dụng trong kịch bản này? – willj

+0

@willj: Tôi vừa tắt máy tính xách tay của mình và tôi đang viết từ điện thoại di động, vì vậy tôi không thể nói chính xác số đoạn văn, nhưng nó ở đâu đó trong khoản 13. Tôi khuyên bạn nên tìm kiếm sự xuất hiện của "toán tử" trong đó khoản, không khó để tìm thấy –

+0

13.6 bắt đầu ra "Các hàm toán tử ứng viên đại diện cho toán tử dựng sẵn được xác định trong Điều 5 được quy định trong điều này. Các chức năng này tham gia vào quá trình phân giải quá tải của nhà điều hành như được mô tả trong 13.3.1.2 và không được sử dụng cho mục đích nào khác . " –

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