2017-12-09 102 views
8

Khi khám phá this answer Tôi phát hiện ra rằng một mẫu lấy gói tham số sẽ không được chấp nhận bởi một mẫu dự kiến ​​mẫu có số lượng thông số cụ thể.Không phù hợp với mẫu <typename...> để tạo mẫu <typename> khiếm khuyết?

Điều này dường như với tôi rằng đó là lỗi do một mẫu có thể lấy bất kỳ số tham số nào, nó sẽ có thể ánh xạ tới một số cụ thể. Có luật sư ngôn ngữ nào có thể giải thích tại sao điều này không được phép không?

Dưới đây là một ví dụ đơn giản:

template <typename...Ts> 
using pack = void; 

template <template <typename> class> 
using accept_template = int; 

accept_template<pack> value = 0; 

tôi sẽ không sử dụng nó trong kịch bản chính xác này tất nhiên. Nó sẽ được sử dụng để chuyển một khuôn mẫu tới một khuôn mẫu khác có thể sử dụng mẫu được truyền theo một cách nào đó. Trong câu trả lời của tôi mà tôi liên kết, tôi đã tuyên bố một cách giải quyết, nhưng tôi vẫn cảm thấy rằng đây là một khiếm khuyết.

Trả lời

12

Hạn chế này đã được nới lỏng do kết quả của P0522, giới thiệu các quy tắc mới để xử lý cách mẫu-đối số khớp với mẫu-tham số mẫu. Do đó, từ giấy:

template<class T, class U = T> class B { /* ... */ }; 
template <class ... Types> class C { /* ... */ }; 
template<template<class> class P> class X { /* ... */ }; 


X<B> xb; // OK, was ill-formed: 
     // default arguments for the parameters of a template argument are ignored 

X<C> xc; // OK, was ill-formed: 
     // a template parameter pack does not match a template parameter 

Ví dụ của bạn không biên dịch trong C++ 14, nhưng sẽ biên dịch trong C++ 17.

+0

Không có tiện dụng. – Adrian

+0

@Adrian Ví dụ trong câu hỏi được chấp nhận bởi GCC 7.2 ở chế độ C++ 17, nếu bạn có tùy chọn sử dụng. – hvd

+0

Tốt để thấy rằng điều này đã được tìm thấy như là một khiếm khuyết. :) – Adrian

Các vấn đề liên quan