주어진 유형이 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
std::remove_reference
및
std::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_type
및 decay
이 두 개의 독립 단계 여야한다고 생각하는 경향이 있습니다. 나는 내 정의를 사용해야 할까?
'remove_reference'와'decay'을 산출 추가 예상치 못한입니다; 'std :: declval '는 rvalue 참조를 반환합니다. – dyp
'T'는 오래된 것입니다 (C++ 11),'decay'은 새로운 것입니다 (C++ 1y), 이것과 관련된 결함이있을 수 있습니다. 어디 보자. –
dyp
@dyp 네,저기서 그렇게 신중하지 않았기 때문에 "실질적으로"썼습니다. – iavr