나는 줄 경우표준 : result_of는 오버로드 된 메서드
typedef std::vector<int> v;
아래 (대안 v::const_iterator
를 사용하는 것입니다, 그러나 이것은 const_iterator
에 따라 상수 반복자의 유형을 캡처 할 수 있습니다 멤버 타입은 명시 적으로 클래스에 정의된다.
typedef typename std::result_of<decltype(&v::cbegin)(v*)>::type const_iterator;
을 참으로, 우리는 위에서 우리가 원하는 않는다는 것을 확인할 수 있습니다.
static_assert(std::is_same<const_iterator, typename v::const_iterator>::value);
그러나 컴파일러 오류가 아래에 있습니다.
typedef typename std::result_of<decltype(&v::begin)(v*)>::type iterator;
컴파일러는 메서드가 const 수정 자에 의해 오버로드되어 명확하게 해결되지 않는다고 불평합니다. 그러나, 나는 모호성을 해결하는 구문을 찾을 수 없습니다. 최소한 const 버전 만 const 객체에서 작동 할 수 있기 때문에 최소한 다음은 모호하지 않아야합니다. 그러나 아래의 경우에도 마찬가지로 문제가 있습니다.
typedef typename std::result_of<decltype(&v::begin)(const v*)>::type const_iterator2;
begin의 특정 const 또는 nonconst 버전은 어떻게 언급합니까?
나는이 대답을 이해하고 있지만 위의'v *'인수의'const' 수정자가 왜 모호성을 해결하지 못합니까? – epl
'std :: declval()'의 리턴 타입은'v'가 아닙니다. –
skypjack
@epl 왜냐하면'&'는 이미 매개 변수를 살펴보기 전에 모호한 함수 이름의 주소를 가져 오지 못했기 때문입니다. –