2015-01-04 19 views
5

Loại std::remove_cv<const int[3]> nên sản xuất? int[3] hoặc const int[3]?Loại std :: remove_cv sẽ sản xuất trên một mảng const T?

const int[3]array of 3 const int phải không ?, và không có vòng loại cv cấp cao nhất. Vì vậy, nó không nên sản xuất const int[3]? Phiên bản mới nhất của gcc/libstdC++ đang sản xuất int[3] Tôi nghĩ vậy. Đây có phải là một lỗi? Tại sao tại sao không?

+0

Trong khi hành vi là hợp lý, tôi tự hỏi nó đã được biện minh như thế nào ... (Có thể đọc nó như một '' mảng '' '') – Deduplicator

+0

Hiệu quả, nó sẽ kết thúc bằng cách sử dụng một chuyên môn như 'template struct remove_cv {using type = T; }; '. Tôi không nghĩ rằng 'T const [N]' sẽ phù hợp với chuyên môn đó. –

+0

@ DietmarKühl: Tiêu chuẩn cho biết "[loại kết quả] sẽ giống với T ngoại trừ bất kỳ vòng loại cv cấp cao nào đã bị xóa". –

Trả lời

8

N4140 §3.9.3 [basic.type.qualifier]/p5, tôi nhấn mạnh:

Cv-vòng loại áp dụng cho một loại mảng bám vào các loại nguyên tố cơ bản , vì vậy các ký hiệu “cv T, ”Trong đó T là loại mảng, đề cập đến một mảng có các yếu tố đủ điều kiện. Một loại mảng mà các thành phần của nó có đủ điều kiện cv cũng được coi là có cùng một tiêu chí là cv. [Ví dụ:

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

Loại cả arr1arr2 là “mảng của 5 const char”, và kiểu mảng được coi là const -qualified. - ví dụ kết thúc]

Xem thêm CWG issue 1059.

Các vấn đề liên quan