Câu chuyện ngắn: không có quy tắc trong tiêu chuẩn mà nói thế nào điều này sẽ làm việc, cũng không phải bất kỳ quy tắc mà nói rằng nó không hoạt động. Vì vậy, GCC và Clang thận trọng từ chối hơn là phát minh ra một quy tắc (phi tiêu chuẩn).
Câu chuyện dài: Lớp cơ sở là loại phụ thuộc, do đó, tra cứu các nhà xây dựng của nó không thể thành công. Đối với mỗi chuyên môn của mytype<T1, T2>
, các nhà thầu tương ứng của pair<T1, T2>
là các nhà thầu của mytype
, nhưng đây không phải là quy tắc có thể được áp dụng có ý nghĩa cho mẫu trước khi diễn giải nói chung.
Về nguyên tắc, có thể có quy tắc nói rằng bạn xem xét các nhà xây dựng của mẫu chính pair
trong tình huống này (giống như khi chúng ta tự tìm kiếm các nhà xây dựng của mypair
để khấu trừ đối số mẫu lớp), nhưng không có quy tắc thực sự tồn tại trong tiêu chuẩn hiện tại. Tuy nhiên, quy tắc như vậy nhanh chóng rơi xuống khi lớp cơ sở trở nên phức tạp hơn:
template<typename T> struct my_pair2 : std::pair<T, T> {
using pair::pair;
};
Những người xây dựng nào cần được đưa vào đây? Và trong những trường hợp như thế này, tôi nghĩ rằng đó là một cách hợp lý rõ ràng rằng tra cứu này không thể nào làm việc:
template<typename T> struct my_pair3 : arbitrary_metafunction<T>::type {
using arbitrary_metafunction<T>::type::type;
};
Có thể chúng tôi sẽ có được một sự thay đổi quy tắc cho phép khấu trừ qua my_pair
của bạn và my_pair2
trên nếu/khi chúng tôi nhận lớp các quy tắc khấu trừ đối số mẫu cho các mẫu bí danh:
template<typename T> using my_pair3 = std::pair<T, T>;
my_pair3 mp3 = {1, 2};
Sự phức tạp liên quan ở đây phần lớn giống như trường hợp xây dựng kế thừa.Faisal Vali (một trong những nhà thiết kế khác về khấu trừ đối số mẫu lớp) có một kế hoạch cụ thể về cách làm cho các trường hợp như vậy hoạt động, nhưng ủy ban C++ chưa thảo luận về phần mở rộng này.
Khi ADL được thực hiện bằng cách sử dụng std :: pair :: pair; bị bỏ qua –
@HariomSingh - Bạn có thể sao lưu nó không? Tôi cũng nghĩ thế. Nhưng sau đó [namespace.udecl]/16. – StoryTeller
@StoryTeller vâng tôi đang làm việc trên ví dụ. Xem xét các quy tắc của ADL –