2017-10-06 39 views
8

Hãy xem xét một ví dụ:Có đảm bảo rằng khấu trừ dùng mẫu template tham số invoke cung cấp hướng dẫn

#include <type_traits> 
#include <string> 

template <template <class> class TT> //#1 
struct Foo { 
    static void foo() { 
     static_assert(std::is_same_v<decltype(TT("abc")), TT<std::string>>); 
    } 
}; 

template <class T> 
struct Bar { 
    Bar(T) {} 
}; 

template <class T> 
Bar(T) -> Bar<std::string>; //#2 

int main() { 
    Foo<Bar>::foo(); 
} 

[clang] cũng như [gcc] cả dường như sử dụng người sử dụng cung cấp hướng dẫn khấu trừ (# 2) khi suy ra như mẫu tham số của mẫu tham số mẫu (# 1). Đây có phải là tính năng tuân thủ tiêu chuẩn không?

Trả lời

4

Có, đây là tiêu chuẩn tuân thủ.

Theo [dcl.type.simple]/2:

Một type-specifier dạng typename optlồng nhau-tên-specifier optmẫu tên tuổi là một giữ chỗ cho một kiểu lớp suy luận ([dcl.type.class.deduct]). Tên mẫu sẽ đặt tên mẫu lớp không phải là tên lớp được tiêm.

[temp.param]/3:

Một kiểu tham số có nhận dạng không theo một lược xác định định danh của nó là một typedef tên (nếu tuyên bố mà không template) hoặc mẫu tên tuổi (nếu được khai báo với template) trong phạm vi của tuyên bố mẫu.

TT là một loại tham số khai báo với template, mà làm cho nó một mẫu tên tuổi và do đó một giữ chỗ cho một kiểu lớp suy luận. Tất cả các quy tắc thông thường chỉ áp dụng tốt.

+0

Tôi thực sự mong đợi câu trả lời đó, nhưng nếu nó xảy ra sai .. thì tôi sẽ lấy lại;) –

+0

như một câu hỏi nhỏ: bạn nghĩ rằng các hướng dẫn khấu trừ tự động không nên được áp dụng? –

+0

@ W.F. Được rồi, tôi hoàn toàn lật câu trả lời :) – Barry

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