Những gì tôi nói dưới đây (theo OLD POST ) phải đúng ở một mức độ nào đó, nhưng vấn đề thực sự với điều này là, SFINAE được sử dụng sai, do đó tôi không chắc chắn nữa rằng đây là một lỗi trong gcc.
Một khai báo bí danh phải luôn luôn thành công, bạn không thể SFINAE ở đó, vì đó không phải là khai báo lớp hoặc chức năng hoặc chuyên môn hóa (điều đó có nghĩa, vì bạn không thể chuyên biệt các bí danh). Nếu khai báo bí danh không thành công, chương trình không được định dạng. Do đó trình biên dịch có thể giả định rằng nó sẽ không bao giờ đi đến trường hợp khai báo bí danh không thành công cho đến khi bạn buộc nó khởi tạo một mẫu như vậy.
Do đó, trình biên dịch hoàn toàn chấp nhận được khi nghĩ rằng điều đó sfinae_v_t<T,...>
luôn luôn T
xảy ra, vì điều đó sẽ xảy ra, khi chương trình không được định dạng sai. Do đó, nó sẽ thấy rằng trong tất cả các trường hợp chương trình không được định dạng sai, chuyên môn hóa một phần không chuyên biệt và như vậy nó sẽ cho bạn biết rằng đây là hình thức không đúng. (Đó là những gì clang làm).
Tôi không nghĩ rằng trình biên dịch buộc phải làm điều này. Và nếu nó không, và chỉ nghĩ "Ok, sfinae_v_t
là một loại, bất cứ điều gì.", Thì không rõ ràng đây là một sự khai báo. Vì vậy, tôi nghĩ cho đến khi chúng tôi khởi tạo một trong số chúng thì không có gì sai khi không đưa ra lỗi.
Nhưng khi chúng tôi khởi tạo nó, sẽ có một vấn đề là chúng tôi có một tuyên bố lại hoặc chương trình không được định dạng do std::enable_if
, tùy thuộc vào đối số mẫu. GCC nên chọn ít nhất một trong số họ nhưng không.
Điều này cũng hoàn toàn không áp dụng cho ví dụ dễ dàng hơn mà không có std::enable_if
. Vì vậy, tôi vẫn nghĩ rằng đây là một lỗi trong GCC, nhưng tôi đủ suy nghĩ rằng tôi không thể nói điều đó với sự chắc chắn nữa. Tôi chỉ muốn nói, ai đó nên báo cáo rằng đó là một lỗi và để những người từ gcc nghĩ về nó.
BÀI ĐĂNG
Đây là một lỗi trong gcc. Tiêu chuẩn cung cấp cho chúng tôi các quy tắc để chuyển đổi một mẫu lớp trong các mẫu hàm. Một mẫu lớp là chuyên biệt hơn so với mẫu khác nếu chức năng của nó đi trước mẫu kia trong thứ tự mẫu hàm một phần.
Tôi đã tạo các hàm ở đây và bây giờ gcc tuyên bố rằng việc gọi chúng là không rõ ràng, do đó cũng phải nói rằng các mẫu lớp được chỉ định như nhau.
Lưu ý: Đọc tiêu chuẩn cẩn thận, trình biên dịch trong đầu tôi đồng ý với tiếng kêu.