xem xét ví dụ đơn giản sau đâyquá tải chuyển đổi hành mẫu
struct C
{
template <typename T> operator T() {return 0.5;}
operator int() {return 1;}
operator bool() {return false;}
};
int main()
{
C c;
double x = c;
std::cout << x << std::endl;
}
Khi biên soạn với Clang, nó mang lại cho các lỗi sau
test.cpp:11:12: error: conversion from 'C' to 'double' is ambiguous
double x = c;
^ ~
test.cpp:4:5: note: candidate function
operator int() {return 1;}
^
test.cpp:5:5: note: candidate function
operator bool() {return false;}
^
test.cpp:3:27: note: candidate function [with T = double]
template <typename T> operator T() {return 0.5;}
^
1 error generated.
trình biên dịch khác tạo ra các lỗi tương tự, ví dụ, GCC và Intel iclc
Nếu tôi xóa operator int
và operator bool
. Nó biên dịch tốt và hoạt động như mong đợi. Nếu chỉ xóa một trong số đó, hãy giữ nguyên toán tử mẫu và nói operator int
, thì phiên bản không phải mẫu luôn được chọn.
Sự hiểu biết của tôi là chỉ khi các hàm mẫu quá tải và mẫu không bằng nhau theo nghĩa là cả hai khớp hoàn toàn hoặc cả hai yêu cầu cùng một chuỗi chuyển đổi, phiên bản không phải mẫu sẽ được ưu tiên. Tuy nhiên trong trường hợp này, có vẻ như trình biên dịch không thấy mẫu toán tử như là một đối sánh hoàn hảo. Và khi cả hai quá trình tải xuống bool
và int
đều xuất hiện, thì tự nhiên nó coi chúng là mơ hồ.
Tóm lại, câu hỏi của tôi là tại sao mẫu toán tử không được coi là khớp hoàn hảo trong trường hợp này?
"Đọc lạ" của bạn về tiêu chuẩn rất thú vị và thực sự có ý nghĩa rất nhiều với tôi. Nếu tôi hiểu nó một cách chính xác, cho dù nhà điều hành int là tốt hơn so với các mẫu phụ thuộc vào đó là F1 và đó là F2. Nếu chúng ta xem F1 = op int, F2 = op, thì tại dấu 3 chúng ta xác định F1 tốt hơn F2 và dừng lại. Nhưng nếu chúng ta xem xét F1 = op , F2 = op int, sau đó tại bullet 2 chúng tôi xác định F1 là tốt hơn và dừng lại. Nhưng nếu có ba trong số họ, sau đó op int và op bool không còn tốt hơn so với những người khác, và do đó không mơ hồ –