Tôi nhận thấy rằng gcc 5.0 từ chối mã sau, trong khi clang 3.6 chấp nhận nó.Có thể sizeof lồng nhau hai lần bao giờ là một biểu thức phụ thuộc?
template<int n>
struct I
{
typedef int Type;
};
template<typename T>
struct A
{
typedef I<sizeof(sizeof(T))>::Type Type;
};
Hai biên dịch dường như khác nhau về việc liệu sizeof(sizeof(T))
là một biểu thức kiểu phụ thuộc hoặc giá trị phụ thuộc vào. Nếu biểu thức là phụ thuộc, sau đó nó theo sau rằng I<sizeof(sizeof(T))>
là một loại phụ thuộc, có nghĩa là typename
nên được yêu cầu.
này được bao phủ bởi các từ ngữ sau đây trong các tiêu chuẩn C++ 11:
[temp.dep.type]/8
Một loại phụ thuộc nếu nó là
- một mẫu đơn giản-id trong đó tên mẫu là tham số mẫu hoặc bất kỳ mẫu nào trong số các đối số mẫu là loại phụ thuộc hoặc biểu thức phụ thuộc vào loại hoặc phụ thuộc vào giá trị
[temp.dep.expr]/4
Expressions trong các hình thức sau đây không bao giờ gõ phụ thuộc (vì kiểu của biểu thức không thể phụ thuộc):
sizeof unary-expression sizeof (type-id)
[temp.dep.constexpr]/2
Biểu thức của biểu mẫu sau đây phụ thuộc vào giá trị nếu biểu thức đơn hoặc biểu thức được nhập độc lập hoặc loại id phụ thuộc:
sizeof unary-expression sizeof (type-id)
giải thích của tôi là sizeof(T)
bao giờ có thể loại phụ thuộc, có nghĩa sizeof(sizeof(T))
bao giờ có thể loại phụ thuộc hoặc giá trị phụ thuộc vào.
Đây có phải là lỗi trong gcc không?
Ồ. GCC cũng nghĩ rằng 'sizeof n' phụ thuộc. http: // melpon.org/wandbox/permlink/BLobLBzkQXNRfDuq – willj
Vâng, 'sizeof n' không phụ thuộc vào kiểu mà phụ thuộc vào giá trị. 'sizeof X', trong đó' X' là * không * loại phụ thuộc không phụ thuộc chút nào. Do đó, 'sizeof sizeof n' phải không phụ thuộc, phải không? – dyp
Điều thú vị là biên dịch trên gcc 4.7.2, nhưng không thành công trên 4.9.0. – Barry