2015-03-16 21 views
10

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.

+2

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

+5

http: //www.open- std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286 –

+0

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

Trả lời

1

T.C. chỉ ra trong his comment cho câu hỏi, đây là số known hole của tiêu chuẩn.

Các từ ngữ hiện tại của 14.5.7 [temp.alias] giao dịch chỉ với sự tương đương của một chuyên môn hóa của một mẫu bí danh với loại-id sau khi thay thế. Từ ngữ cần phải được thêm vào chỉ định trong những trường hợp nào một mẫu bí danh chính nó tương đương với một mẫu lớp.

Tức là: mọi chuyên môn của foo, barbuz sẽ đại diện cho cùng một loại. Nhưng không đảm bảo rằng, khi được sử dụng làm thông số mẫu, foo, barbuz có thể hoán đổi cho nhau.

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