2015-01-04 2 views
5

std::remove_cv<const int[3]>은 어떤 종류의 것을 생산해야합니까? int[3] 또는 const int[3]?std :: remove_cv는 const T의 배열에서 어떤 유형을 생성해야합니까?

const int[3]array of 3 const int이며, 최상위 레벨의 cv-qualifier는 없습니다. 그러니까 const int[3]을 생산하지 않아야합니까? gcc/libstdC++ 최신 버전은 int[3]을 생성하고 있다고 생각합니다. 이거 버그 야? 왜 안돼?

+0

행동이 합리적인 동안, 나는 그것이 어떻게 정당화되는지 궁금합니다 ... (하나는 그것을'int'의'const' 배열로 읽을 수 있습니다.) – Deduplicator

+0

효과적으로, 템플릿 struct와 같은 전문화를 사용하게 될 것입니다 remove_cv {사용 유형 = T; };'. 나는'T const [N]'이 그 전문화와 일치 할 것이라고 생각하지 않는다. –

+0

@ DietmarKühl : Standard에서는 "[결과 유형]은 T와 동일해야하지만 최상위 수준의 cv-qualifier는 제거되었습니다."라고 말합니다. –

답변

8

N4140 §3.9.3 [basic.type.qualifier]/P5 강조 광산 :

CV-한정어 기본 요소 유형에 첨부 배열 형태에 적용되므로 표기 "cv T, "T이 배열 유형 인 경우 은 요소가 적합하지 않은 배열을 나타냅니다. 요소가 cv-qualified 인 배열 유형 도 요소로 동일한 cv-qualified를 가진 것으로 간주됩니다. [ 예 :

typedef char CA[5]; 
typedef const char CC; 
CC arr1[5] = { 0 }; 
const CA arr2 = { 0 }; 

arr1arr2 양자의 타입은 "5 const char 배열"및 이 어레이 형이 const restrict로 간주된다. - 최종 예를]

CWG issue 1059 참조하십시오.

관련 문제