, 나는 오류가 발생 :템플릿 기능 유형 공제 및 연산자 << C++ 내가 <strong>MSVC++</strong> 다음과 같은 코드를 컴파일 할 때
struct A
{
template<typename T>
void operator<<(T&& x)
{
}
};
void f()
{
}
int main()
{
A().operator<<(f); // ok
A() << f; // error
return 0;
}
g ++ 및 그 소리이 코드의 벌금을 컴파일 모두. AFAIK, '확인'와 '오류'라인은 정확히 같은 일을하고 무효 (&)()로 추론된다 T을 입력합니다. 아니면 void() 및 함수에 대한 rvalue 참조가 허용됩니까? 그렇다면 그 의미는 무엇입니까? 함수를 참조로 전달하는 것이 좋습니까? 그것입니까 MSVC++ 버그 '오류'줄을 컴파일하지 못했습니다? 오류 출력 :
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) ]
당신이 당신의 C++ 컴파일러의 버전을 제공 할 수있는 비주얼 스튜디오 2013 컴파일러에서 수정되었습니다? – xis
NOV CTP 업데이트를 포함한 MSVC++ 2012, gcc 4.5.3 및 4.7.2 테스트, clang 3.0 및 3.1 테스트. – dsi
VC11이 없기 때문에 조사하기가 어렵지만 URef가 무너지는 버그와 같은 냄새가납니다. 컴파일러는 실수로이를 함수에 대한 RRef로 해석하고 입력에 lvalue를 허용하지 않습니다. 흥미로운 것은'typedef void (* test)(); 테스트 g() {return f; } ... A() << g();'함수 포인터가 작동 할 때 –