2014-02-23 2 views
15

주어진 유형이 A,B 인 경우 임의의 유형 에 대해 가변적 인 경우 std::common_type<A...>을 무시하고 std::common_type<A,B>의 정확한 정의와 관련이 있습니다.std :: common_type은 std :: decay를 사용해야합니까?

  • cppreference.com : C::type = std::decay<T>::type

  • cplusplus.com : 그래서 소스의 수에 따라, 이제

    using T = decltype(true ? std::declval<A>() : std::declval<B>()); 
    using C = std::common_type<A,B>; 
    

    을하자, 나는 다음과 같은 관계 (간결 typename 건너 뛰기)을 발견 C::type = T

  • GCC 4.8.1 <type_traits> implementatio N : T이 유효 C::type = std::decay<T>::type 경우는 true, 그렇지 않은 경우는 C는 ("SFINAE 친화적")를 ::type 멤버를 포함하지 않는

  • 연타 3.3 <type_traits> 구현 :

C::type = std::remove_reference<T>::type

내가 찾아 "SFINAE 친화적"버전 GCC의 사소한 세부 사항, std::remove_referencestd::decay 실제적으로 만 다시 내가 많이 걱정하고 있지 않다있는 내장 배열과 기능, 플러스 CV-자격에 차이가있다. 내 질문은

decay<T>::type 또는 T이되어야합니까? decay<T>::type을 사용하는 이유는 무엇입니까? 예를 들어 결과가 A() + B() 인 경우에만 표시됩니다. 산술 표현식? 예컨대

, 약간의 실험, I는 종류가 동일한 경우 "그냥 T"의 정의의 경우에, 우리는

common_type<int&,int&> = int& 
common_type<int&,long&> = long 

, 는 좌변 기준을 유지해야한다는 발견 .

int a; 
long b; 
(true ? a : b) = 0; 

이없는 동안이,

int a, b; 
(true ? a : b) = 0; 

이 유효하다는 사실을 반영한다. "유형이 동등한 경우 할당을 허용하는"의미는 하나의 응용 프로그램에서 정확히 필요한 것이며, 나는 common_typedecay이 두 개의 독립 단계 여야한다고 생각하는 경향이 있습니다. 나는 내 정의를 사용해야 할까?

+0

'remove_reference'와'decay'을 산출 추가 예상치 못한입니다; 'std :: declval '는 rvalue 참조를 반환합니다. – dyp

+0

'T'는 오래된 것입니다 (C++ 11),'decay '은 새로운 것입니다 (C++ 1y), 이것과 관련된 결함이있을 수 있습니다. 어디 보자. – dyp

+0

@dyp 네,저기서 그렇게 신중하지 않았기 때문에 "실질적으로"썼습니다. – iavr

답변

12

수 std한다 :: common_type 사용 표준 : 부패를?

예 (Library Working Group Defect #2141 참조).

짧은 버전 (위의 긴 버전, 참조 링크) :

template <class T, class U> 
struct common_type<T, U> { 
    typedef decltype(true ? declval<T>() : declval<U>()) type; 
}; 
  • common_type<int, int>::type 때문에 수율 :

    • declval<A>()는 n3337하는 A&&

    • common_typedeclval를 통해 지정 반환 int&&

    • 결의안은 decay

      template <class T, class U> 
      struct common_type<T, U> { 
          typedef decay_t < decltype(true ? declval<T>() : declval<U>()) > type; 
      }; 
      
    • common_type<int, int>::type은 이제 참조 유형에 대한 CV-자격에 차이가 int

  • +1

    흠 ... 그것은 실제로 우리가'부패 '를 사용하는 방법을 보여줍니다. 그래서 질문에 답합니다. 고마워요. 그러나 나 자신의 정의를 사용해야합니다. 예,''는'int'를주고'int &&'가 아니라''이'int &'를 주어야합니다. 따라서'decland'에 의해 추가 된'&&'만이 제거되어야합니다. – iavr

    +0

    @iavr LWG 페이지의 토론에 * " 'common_type'의 사용자가 참조 유형을 결과로 가져 오기를 기대하지 않습니다. * * 사용자 *가 누구인지는 알 수 없습니다. – dyp

    +0

    글쎄, 확실하지 :-) – iavr

    관련 문제