Khi trả lời this question về cách cố gắng xây dựng một hàm tạo tham chiếu chuyển tiếp variadic chỉ nên được gọi nếu không có hàm tạo nào khác hợp lệ. Đó là, nếu có một:Nhà xây dựng dự phòng variadic - tại sao tính năng này hoạt động?
C(const char*, size_t) { } // 1
template <typename... T, ???> C(T&&...) { } // 2
Chúng tôi muốn C c1{"abc", 2};
để gọi số (1), mặc dù việc chuyển đổi bắt buộc, nhưng C c2{1, 2, 3};
để gọi số (2), như (1) không thể áp dụng.
tôi đề xuất các giải pháp sau đây:
template <typename... T,
typename = std::enable_if_t<!std::is_constructible<C, T&&...>::value>
>
C(T&&...) { }
Và bằng cách đề nghị, ý tôi là, tôi đã thử nó và rất ngạc nhiên khi phát hiện ra rằng nó thực sự hoạt động. Nó biên dịch và thực hiện chính xác những gì tôi đã hy vọng cho cả gcc và clang. Tuy nhiên, tôi không hiểu giải thích tại sao lý do tại sao nó hoạt động hoặc thậm chí nếu nó thực sự là giả định để hoạt động và gcc và clang đều vừa đủ khả năng. Là nó? Tại sao?
Dựa trên sự hiểu biết của tôi nếu một hàm tạo khác có sẵn cho 'C c1 {" abc ", 2};' hơn 'std :: enable_if_t' sẽ không có giá trị, và do đó tạo một cái gì đó như' template 'và SFINAE sẽ không tạo hàm tạo khuôn mẫu. –
Đăng lại nhận xét của tôi về câu trả lời của bạn: [ví dụ được sửa đổi này] (http://melpon.org/wandbox/permlink/JM2U8pxxvguewhd1) cho thấy đối số mặc định SFINAE xem * tất cả * hàm tạo của 'C', thậm chí cả các hàm được khai báo sau mẫu hàm tạo. – dyp
Đối với những gì nó có giá trị, MSVC 2013 cũng chấp nhận cú pháp này dưới/W4 và in giống như gcc và clang với [ví dụ này] (http://coliru.stacked-crooked.com/a/1fe984a4ceb6e193), mặc dù nó * không * cảnh báo về nhiều hàm tạo mặc định và intellisense dường như không nghĩ rằng lệnh gọi thứ ba tới 'Foo :: Foo' là hợp lệ. (Một lần nữa, điều này là mặc dù VC++ 18 là tốt với nó) – jaggedSpire