Đây là một cái gì đó tôi quan sát thấy trên các trình biên dịch khác nhau. Dường như có lỗi trình biên dịch.Tại sao biểu thức tham số mẫu không kiểu xử lý không nhất quán giữa các trình biên dịch?
template <int I>
struct X
{ };
int main(void)
{
X<(16 > 1)> a; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) > 1)> b; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(16 >> 1)> c; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) >> 1)> d; // Fails on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<16 > 1> e; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
X<int(16) > 1> f; // Fails on vc9, fails on g++ 4.1.2, fails on Comeau 4.3.10.1
X<16 >> 1> g; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
X<int(16) >> 1> h; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
}
Tại sao sự không nhất quán đó? Những gì được cho phép/không được phép theo tiêu chuẩn? Hành vi này cũng chịu trách nhiệm về lỗi cú pháp khi sử dụng BOOST_AUTO trên vc9. Dường như với tôi rằng Comeau đang làm đúng công việc bằng cách từ chối tất cả các biểu thức mà không có dấu ngoặc đơn.
Tôi không nghĩ rằng nó có bất cứ điều gì để làm với các mẫu là không loại, mà là vì nó sử dụng ký tự '>' bên trong khuôn mẫu. – Marcin
Bạn nói đúng Marcin, tôi đã thấy hành vi không nhất quán này với các toán tử quá tải '>' và '>>' của các lớp do người dùng định nghĩa. – Sumant
Bởi vì điều này sẽ là một cấu trúc hiếm khi được sử dụng và do đó ít có khả năng được kiểm tra. Và bạn sẽ rất tức giận khi sử dụng chúng trong mã thực. Nhưng nó là giá trị trình này như là bài kiểm tra cho nhà sản xuất trình biên dịch để họ có thể thêm nó vào bộ thử nghiệm của họ những điều điên rồ người làm. –