Visual C++ 2012. Mã. Tôi nghĩ nó nên biên dịch; trình biên dịch không đồng ý một cách tôn trọng. Tôi đã thu hẹp yêu cầu của mình xuống:Độ phân giải quá tải không rõ ràng bất ngờ trong VC++ 2012
struct B { };
void foo(B* b, signed int si) { } // Overload 1
void foo(B const* b, unsigned int ui) { } // Overload 2
int main()
{
B b;
unsigned int ui;
foo(&b, ui);
}
Vì vậy, chúng tôi đã có hai ứng cử viên để giải quyết quá tải. Đối với quá tải đầu tiên, đối số đầu tiên khớp chính xác, và đối số thứ hai yêu cầu một chuyển đổi không tách rời (chưa ký để ký). Đối với quá tải thứ hai, đối số thứ hai khớp chính xác, và đối số đầu tiên yêu cầu điều chỉnh cv (vì &b
là một con trỏ trỏ tới không phải là const).
Có vẻ như điều này hoàn toàn không rõ ràng. Đối với quá tải 1, đối số đầu tiên là "Đối sánh chính xác" như được xác định bởi phần tiêu chuẩn về độ phân giải quá tải, nhưng đối số thứ hai là "Chuyển đổi". Đối với quá tải 2, cả hai đối số là "Đối sánh chính xác" (chuyển đổi bằng cấp có cùng thứ hạng với danh tính). Do đó (lý do hoàn toàn không hoàn hảo của tôi), nên chọn quá tải 2, không có sự mơ hồ. Chưa:
a.cpp(12): error C2666: 'foo' : 2 overloads have similar conversions
a.cpp(6): could be 'void foo(const B *,unsigned int)'
a.cpp(5): or 'void foo(B *,int)'
while trying to match the argument list '(B *, unsigned int)'
note: qualification adjustment (const/volatile) may be causing the ambiguity
GCC có vẻ tốt với mã, cả bằng phương ngữ mặc định và C++ 11 (cảm ơn, IDEOne!). Vì vậy, tôi kiiiiind của nghiêng để điều này lên đến một lỗi trong MSVC, nhưng (a) bạn biết những gì họ nói về những người nghĩ rằng lỗi của họ là lỗi trình biên dịch, và (b) điều này có vẻ như nó sẽ là một lỗi khá rõ ràng , loại sắp xếp sẽ gửi cờ đỏ trong quá trình kiểm tra sự phù hợp của chúng.
Đây có phải là MSVC không tuân thủ hay GCC không tuân thủ không? (Hoặc cả hai?) Có phải lý do của tôi liên quan đến âm thanh phân giải quá tải không?
Tôi không biết trình biên dịch nào là đúng, nhưng là con người tôi muốn biết quá tải sẽ được sử dụng mà không cần phải định hướng dựa trên "ưu tiên" của hai loại chuyển đổi :-) – Cameron
@Cameron Oh, tôi đồng ý. Trường hợp sử dụng thực tế có ý nghĩa hơn rất nhiều, và thực sự * trông * rõ ràng. – Sneftel