음, 어쩌면 그렇게 놀라운 것은 아닐지도 모릅니다. 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++ 사양에 대한 커뮤니티 전체의 과장 해석입니까? 아니면 여기에서 볼 수있는 다른 것입니까? 아니면 내 일부에 대한 어리석은 감시?
'operator <<'대신'operator >>'를 사용 했습니까? –
@ MarkB : 예, 감사합니다. 규칙이 모두 적용되지만. –
나는 그가 연산자 >>를 의미한다고 가정하고 오타 (typo)이다. 그러나 내가 그 대답을 받아들이는 동안, 나는 그 규격이 더 깊은 문제를 암시한다고 생각할 수밖에 없다. 피연산자의 (변환 가능한) 유형이 왜 영향을 미칩니 까? 필자의 취향에 따라 두 형식은 항상 동의어 여야하며, 피연산자 유형을 고려하기 전에 짧은 형식에서 긴 형식으로 다시 작성해야합니다. – BitTickler