2017-10-06 23 views
8

bir örneği düşünün kılavuzluk garanti ediliyor:o şablon şablon parametresi çağırmak kullanıcı sağlanan kesinti

#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] yanı sıra [gcc] hem kullanıcı sağlanan kesinti kılavuzları kullanın görünmektedir (# 2) şablonun şablon parametresi deducing zaman şablon parametresi (# 1). Standart uyumlu bir özellik midir?

cevap

4

Evet, bu standart olarak uyumludur. [dcl.type.simple]/2 göre

:

A tip belirteci formu typename optiç içe-ad-belirteci optşablon adı bir çıkarılmış sınıf türü için bir yer tutucudur ([dcl.type.class.deduct]). şablon adı, bir enjekte edilmiş sınıf adı olmayan bir sınıf şablonunu adlandırmalıdır.

Ve [temp.param]/3:

A kimin tanımlayıcı üç nokta uymadığı bir (template olmadan bildirilen ise) typedef-name veya şablon adı olma tanımlayıcı tanımlar tip parametreli Şablon bildiriminin kapsamında (template ile bildirilmişse).

TT

bir şablon adı ve bir çıkarılmış sınıf türü için dolayısıyla tutucu yapar template ile bildirilen bir tip-parametresidir. Tüm normal kurallar iyi uygulanır.

+0

Aslında bu cevabı bekledim, ama eğer yanlış olsaydı .. o zaman onu geri alacağım;) –

+0

küçük bir soru olarak: otomatik kesinti kılavuzlarının da uygulanmaması gerektiğini düşünüyor musunuz? –

+0

@ W.F. Tamam, cevabı tamamen çevirdim :) – Barry

İlgili konular