2015-01-07 2 views
5

음, 어쩌면 그렇게 놀라운 것은 아닐지도 모릅니다. Stackoverflow에는 그 점에 많은 질문과 기여가 있습니다. 오직 그들 만이 정확하게 그 지점에 있지 않습니다.연산자 >> (,) 과부하가 놀라운 방식으로 작동합니다

여기

은 C++ 표준 추출물 (사실은 C++ 14 초안하지만 통로가 현재 C++ 11 표준에서 동일한 가정)

운영자 함수 여야한다 비 정적 멤버 함수이거나 형식이 클래스 인 매개 변수가 하나 이상있는 비 멤버 함수이거나 클래스에 대한 참조, 열거 형 또는 열거 형에 대한 참조 일 수 있습니다. 연산자의 우선 순위, 그룹화 또는 피연산자 수를 변경할 수 없습니다. 이 연산자를 구현하는 연산자 함수를 정의하여 특정 클래스 및 열거 유형에 대해 =, (단항) & 및 (쉼표)를 각 유형에 대해 미리 정의 할 수 있습니다. 연산자 함수는 다른 기본 클래스 함수와 동일한 방식으로 상속됩니다.

따라서, >> >>에 매개 변수로 1 클래스 유형과 하나의 비 클래스 유형을 갖는 것이 합법적입니다. 표준은 "첫 번째"또는 "두 번째"매개 변수를 말하지 않습니다. 그 중 "하나"는 클래스 유형이어야합니다.

int operator>> (int v, std::function<int(int)> transformer) 
{ 
    int v1 = transformer(v); 
    DGS::CLogger::GetLogger()->Log<int>(&IntFormatter, v1); 
    return v1; 
} 
static int DoItLoggedAndCompact(int value) 
{ 
    int x = operator>>(operator>>(value, DoIt) , AnotherIntCalculation); // compiles and works! 
    return x; 
// The following line produces (with clang++): 
// error: invalid operands to binary expression ('int' and 'int (*)(int)') 
//  return value >> DoIt >> AnotherIntCalculation; : 
} 

정확한 진술하면서, "A 함수 포인터는 클래스 타입이 아닌"있습니다, 포괄적 인 대답되지 않습니다 : 여기에

나를 놀라게 코드 조각

. int x = ...으로 시작하는 재 작성된 코드와 연산자 >> second 매개 변수의 정의에서 볼 수 있듯이 함수 포인터는 자동으로 std :: function으로 변환됩니다.

나는 동의어 형식의 두 가지 (혐의로) 동의어에 대한 변환 규칙이 다른 것을 알 수있는 절을 표준에서 찾을 수 없습니다.

그래서 이것은 컴파일러 버그, C++ 사양에 대한 커뮤니티 전체의 과장 해석입니까? 아니면 여기에서 볼 수있는 다른 것입니까? 아니면 내 일부에 대한 어리석은 감시?

답변

6

그러나 "함수 포인터가 클래스 유형이 아닙니다."은 정답 인입니다.

연산자 오버로드 확인 피연산자식이 원래 클래스 또는 열거 형이있는 경우에만

규범 규칙은 13.3.1.2 (강조에 발생합니다

절 13.6에서 다음 참고가있다 광산) :

표현식에서 연산자의 피연산자가 클래스 또는 열거 형 유형이없는 경우, operato R은 피연산자가 클래스 또는 열거 인 형태를 갖는 경우 조 제

에 따른 내장 연산자로 가정하고 해석하는 사용자 드 인터넷 NED 연산자 기능이 연산자 구현 선언 될 수도 또는 내장 연산자에 적합한 유형으로 피연산자를 변환하기 위해 사용자 정의 변환이 필요할 수 있습니다.이 경우 과부하 해결은 연산자를 구현하기 위해 호출 할 연산자 함수 또는 내장 연산자를 결정하는 데 사용됩니다. 피연산자 중 하나는 클래스 타입 인 경우에만 제

폼은 동의어 표에 요약 따라서, 오퍼레이터 표기 제 해당 함수 호출 표기로 변환된다. 어느 쪽도 여기에 없으므로 operator>>()으로 재 작성하지 않습니다.

+0

'operator <<'대신'operator >>'를 사용 했습니까? –

+0

@ MarkB : 예, 감사합니다. 규칙이 모두 적용되지만. –

+0

나는 그가 연산자 >>를 의미한다고 가정하고 오타 (typo)이다. 그러나 내가 그 대답을 받아들이는 동안, 나는 그 규격이 더 깊은 문제를 암시한다고 생각할 수밖에 없다. 피연산자의 (변환 가능한) 유형이 왜 영향을 미칩니 까? 필자의 취향에 따라 두 형식은 항상 동의어 여야하며, 피연산자 유형을 고려하기 전에 짧은 형식에서 긴 형식으로 다시 작성해야합니다. – BitTickler