2013-02-05 6 views
13

, 나는 오류가 발생 :템플릿 기능 유형 공제 및 연산자 << 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) ] 
+1

당신이 당신의 C++ 컴파일러의 버전을 제공 할 수있는 비주얼 스튜디오 2013 컴파일러에서 수정되었습니다? – xis

+0

NOV CTP 업데이트를 포함한 MSVC++ 2012, gcc 4.5.3 및 4.7.2 테스트, clang 3.0 및 3.1 테스트. – dsi

+0

VC11이 없기 때문에 조사하기가 어렵지만 URef가 무너지는 버그와 같은 냄새가납니다. 컴파일러는 실수로이를 함수에 대한 RRef로 해석하고 입력에 lvalue를 허용하지 않습니다. 흥미로운 것은'typedef void (* test)(); 테스트 g() {return f; } ... A() << g();'함수 포인터가 작동 할 때 –

답변

2

그래서 다음과 같이 x() 내부 오버로드 기능을 호출 할 수 있습니다

에서 제공하는 코드가 유효하고 함수를 rvalue 참조가 허용되는 동안 (그들은 동일한 행동 여기에 템플릿 공제 중 T가 무효화되어야합니다 (&)().

MSVC의 bug은 내 코드가 컴파일되지 않도록합니다.

UPDATE는 : 버그

4

void operator<<(T&& x)? void operator<<(T& x)이 그 용도로 사용됩니다.

이 기능은 내 자신의 질문에 대답,

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

}; 
void f() 
{ 
} 

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

아니요, rvalue 참조를 사용하여 임시 _function objects_가 복사되고 이동되지 않도록합니다. _functions_에 대해 어느 쪽이든 똑같이 작동합니다. – dsi