17

Trong khi chơi với các tham chiếu phổ quát, tôi bắt gặp trường hợp này, nơi clang và gcc không đồng ý về độ phân giải quá tải.Đối số lvalue có thích tham số tham chiếu lvalue hơn tham chiếu chung không?

#include <iostream> 

struct foo {}; 

template<typename T> 
void bar(T&) { std::cout << "void bar(T&)\n"; } 

template<typename T> 
void bar(T&&) { std::cout << "void bar(T&&)\n"; } 

int main() 
{ 
    foo f; 
    bar(f); // ambiguous on gcc, ok on clang 
} 

gcc reports cuộc gọi ở trên không rõ ràng. Tuy nhiên, clang chọn quá tải và biên dịch thành công T&.

Trình biên dịch nào sai và tại sao?

Chỉnh sửa:
Đã kiểm tra cùng mã trên Bản xem trước VS2013 và đồng ý với tiếng kêu; ngoại trừ Intellisense, bên phía gcc :-)

+5

Đây là [GCC bug 54425] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54425). – Casey

+0

Cả hai trình biên dịch intel (13.0.1) và pgi (13.4) cũng mang lại một lỗi về điều đó. – Zulan

Trả lời

18

"Tham chiếu chung" sẽ suy ra tham số là foo&. Mẫu đầu tiên cũng suy ra tham số là foo&.

C++ có quy tắc đặt hàng một phần cho các mẫu chức năng làm cho T& trở nên chuyên biệt hơn T&&. Do đó mẫu đầu tiên phải được chọn trong mã ví dụ của bạn.

+1

Vậy điều đó có nghĩa là gcc là sai? –

+6

@DrewMcGowen yes – Yakk

+4

Tìm thấy tham chiếu chuẩn - từ phần N3691 §14.8.2.4/9 – Praetorian

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