2013-02-05 40 views
13

Khi tôi biên dịch đoạn mã sau với MSVC++, tôi nhận được một lỗi:Template loại chức năng trích và operator << C++

struct A 
{ 
    template<typename T> 
    void operator<<(T&& x) 
    { 
    } 

}; 
void f() 
{ 
} 
int main() 
{ 
    A().operator<<(f); // ok 
    A() << f;    // error 

    return 0; 
} 

g ++kêu vang cả biên dịch mã tốt này. AFAIK, 'ok' dòng và 'lỗi' làm chính xác những điều tương tự, và gõ T là suy luận để void (&)(). Hoặc là các tham chiếu void() và rvalue có được cho phép không? Nếu vậy, ý nghĩa của chúng là gì? Có được phép chuyển các hàm theo tham chiếu như vậy không? Có phải lỗi MSVC++ không thể biên dịch 'lỗi'? BTW, đầu ra lỗi:

no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion) 
could be 'void A::operator <<<void(void)>(T (__cdecl &&))' 
with[ T=void (void) ] 
+1

bạn có thể cung cấp các phiên bản của bạn C++ biên dịch? – xis

+0

MSVC++ 2012 với bản cập nhật NOV CTP, gcc 4.5.3 và 4.7.2 được thử nghiệm, kiểm tra clang 3.0 và 3.1. – dsi

+0

Tôi không có VC11, vì vậy thật khó để tôi điều tra, nhưng nó có mùi giống như một lỗi với URef sụp đổ. Trình biên dịch nhầm lẫn diễn giải nó như là một RRef để hoạt động và không chấp nhận một lvalue trong đầu vào. Sẽ rất thú vị khi kiểm tra xem liệu 'typedef void (* test)(); kiểm tra g() {return f; } ... A() << g(); 'sẽ làm việc –

Trả lời

2

Vì vậy, trả lời câu hỏi của riêng tôi:

Các mã được cung cấp là hợp lệ và trong khi tài liệu tham khảo rvalue chức năng được phép (chúng hoạt động giống hệt nhau để tham khảo lvalue), ở đây trong quá trình khấu trừ mẫu T sẽ bị hủy (&)().

A bug trong MSVC ngăn mã của tôi không được biên dịch.

CẬP NHẬT: Các lỗi đã được cố định trong Visual Studio 2013 biên dịch

4

Tại sao void operator<<(T&& x)? void operator<<(T& x) phục vụ mục đích.

Chức năng có thể được gọi với x() chức năng bên trong quá tải như sau

struct A 
{ 
    template<typename T> 
    void operator<<(T& x) 
    { 
     x(); 
    } 

}; 
void f() 
{ 
} 

int main() 
{ 
    A().operator<<(f); 
    A() << f;    
    return 0; 
} 
+0

Không, tôi sử dụng tham chiếu rvalue để các đối tượng _function tạm thời_ sẽ được di chuyển, không được sao chép. Đối với _functions_ một trong hai cách sẽ làm việc như nhau mặc dù. – dsi

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