2017-01-19 4 views
4
을에서 const 적용

나는 줄 경우표준 : 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 버전은 어떻게 언급합니까?

답변

4

다음은 당신이 원하는 것을 : 여기

using v = std::vector<int>; 
using iter = decltype(std::declval<v>().begin()); 
static_assert(std::is_same<iter, typename v::iterator>::value); 

문제는 &v::begin 모호한 것입니다. v::begin 함수가 두 개 있으며 & 연산자는 주소를 반환 할 연산자를 알 수 없습니다. std::declval을 사용하면이를 해결할 수 있습니다. std::declval<v>()의 반환 유형이 v이므로 컴파일러에서는 const가 아닌 v::begin()에 관심이 있다는 것을 알고 있습니다. 어떤 물체가이 코드에서 생성되지 않도록

using citer = decltype(std::declval<const v>().begin()); 
static_assert(std::is_same<citer, typename v::contst_iterator>::value); 

참고 :

마찬가지로, 다음은 당신에게 CONST 버전을 가져옵니다. std::declval에는 정의가 없으므로 decltype과 같은 평가되지 않은 컨텍스트에서만 작동합니다.

+0

나는이 대답을 이해하고 있지만 위의'v *'인수의'const' 수정자가 왜 모호성을 해결하지 못합니까? – epl

+0

'std :: declval ()'의 리턴 타입은'v'가 아닙니다. – skypjack

+0

@epl 왜냐하면'&'는 이미 매개 변수를 살펴보기 전에 모호한 함수 이름의 주소를 가져 오지 못했기 때문입니다. –

관련 문제