2016-03-27 21 views
5

Verilen Aşağıdaki basitDeğişkin şablon yapıcı öncelik

template <typename T> 
struct A 
{ 
    A(T a) {} 

    template <typename ... Ts> 
    A(T a, Ts ... more) {} 
}; 

int main() 
{ 
    A<int> a(1); 
} 

Ne A(T a) variadic şablon yapıcı yerine çağrılacak olacağı garantidir ve neden struct? Tint olarak anlaşılabilmektedir zaman

cevap

6

aradığınız standardında bölüm A bir işlev parametre paketten transforme edilmiş ve P parametre paketi değilse

, tip kesinti başarısız §14.8.2.4 olduğunu. Aksi takdirde, elde edilen P ve A tiplerini kullanarak, kesinti 14.8.2.5'te açıklandığı gibi yapılır. P bir işlev parametre paketi ise, argüman şablonunun kalan her parametre tipinin A tipi, işlev parametre paketinin declarator-id'inin P tipi ile karşılaştırıldığında olur. Her bir karşılaştırma, parametre paketiyle genişletilen şablon parametre paketlerindeki sonraki pozisyonlar için şablon argümanlarını çıkarır. Belirli bir tür için kesinti başarılı olursa, argüman şablonundaki tür en azolarak kabul edilir.

[Örnek:

template<class... Args> void f(Args... args); // #1 
template<class T1, class... Args> void f(T1 a1, Args... args); // #2 
template<class T1, class T2> void f(T1 a1, T2 a2); // #3 
f(); // calls #1 
f(1, 2, 3); // calls #2 
f(1, 2); // calls #3; non-variadic template #3 is more 
// specialized than the variadic templates #1 and #2 

- uç örneği]

+1

14.8.2.4 daha özel olduğunu görmek için iki fonksiyonu şablonları karşılaştırılması ile ilgilidir. Ancak bu örnekte aday işlevlerden biri, bir işlev şablonu değildir. – aschepler

+0

@aschepler Derleyicinin bu kadar uzağa gitmesi gerekmediğini söylüyorsunuz, çünkü kusursuz bir eşleşme olan, şablon olmayan bir işleve sahip olmak, şablon çözünürlüğüne bile gerek duymuyor demektir. Katılıyorum. Bunu kapsayan başka bir bölüm daha olacak. –

2

aynı nedenle f(const int&)f(const T&) daha iyi bir eşleşme: A(int) olmayan bir şablon işlevi ve boş liste olarak çıkarılabilir Ts... ile A(int, Ts...) bir işlev şablonu uzmanlık olduğunu.