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 ++ và 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) ]
bạn có thể cung cấp các phiên bản của bạn C++ biên dịch? – xis
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
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 –