Hãy xem xét một loạt các mẫu bí danh:nhận dạng của mẫu bí danh
template<class T> using foo = T*;
template<class T> using bar = T*;
template<class T> using buz = foo<T>;
template< template<class>class TT > struct id {};
using id_foo = id<foo>;
using id_bar = id<bar>;
using id_buz = id<buz>;
Are id_foo
, id_bar
, id_buz
loại giống và khác nhau? Có phải foo
, bar
, buz
các mẫu giống nhau hoặc khác nhau không?
Trình biên dịch khác nhau có ý kiến khác nhau về điều đó. Riêng
- MSVC 2015 và kêu vang 3,5 điều trị tất cả họ đều khác nhau
- gcc 4.9 xử lý
buz
là giống nhưfoo
Chuẩn C++ 11 trong chương 14.5.7 "mẫu Bí danh " Không rõ ràng.
Lời giải thích của [cppreference] (http://en.cppreference.com/w/cpp/language/type_alias) dường như ngụ ý rằng có, chúng là cùng một IMO. Chỉnh sửa: Relevant snippet: 'Một mẫu bí danh là một khuôn mẫu, khi chuyên biệt, tương đương với kết quả của việc thay thế các đối số mẫu của mẫu bí danh cho các tham số mẫu trong loại-id' – AndyG
http: //www.open- std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286 –
Câu trả lời cho các câu hỏi sau có thể hữu ích: [_Sử dụng bí danh mẫu thay vì mẫu trong template_] (http://stackoverflow.com/q/17392621/3043539) và [Hành vi _Strange của is_same_template trên mẫu aliases_] (http://stackoverflow.com/q/22892052/3043539). – Constructor