2014-09-14 18 views
5

initlializer_list aşağıdaki fonksiyon şablon var:Fonksiyon şablon kesinti ve

template <typename K, typename V> 
void f(std::initializer_list<std::pair<const K, V>> il) 
{ 
    //... 
} 

şöyle ben işlevi çağırmak:

f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)}); //(a) 

ve iyi çalışıyor. Doğru tipini anlamak mümkün değildir

f({{1,2}, {3,4}}); //(b) 

ve ben çizgisinde bir derleme hatası alıyorum: Ben denemek ve onu ararsanız

Ancak şöyle

'no matching function for call to 'f(<brace-enclose initializer list>) 
note candidate is: 
note: template <class K, class V> void f(std::initializer_list<std::pair<const K, V>>)' 

f({std::pair<const int,int>(1,2), {3,4}}); //(c) 

tip kesinti çalışır ama denemek ve onu ararsanız şöyle: Ben onu aramak aşağıdaki gibi

f({std::make_pair(1,2), {3,4}}); //(d) 

Daha önce olduğu gibi aynı derleme hatasını alıyorum.

Sorum şu:

neden (c) 'de şablon türü kesinti iş ama değil (d)' de?

Ben benzer baktım, yaşlı SO mesajların (Derleyici bayrak -std = C++ 11 ile gcc v4.6.3) ama onlar oldukça bu soruyu cevaplamak için görünmedi.

cevap

4

b ile sorun) derleyici

{1,2} 
yanı bir initializer_list<int> için alınabilir, d sorun) olduğunu

gibi bir şey bu yana türlerini anlaması mümkün olmadığıdır Bu make_pair,

+0

çiftinin ilk kısmı için const int üretmeyecek, ancak, b) in const_ const öğesinden const olmayan int'yi unuttuğunu düşündüm. Teşekkürler. – TPJ

+0

'{1,2}', '' initializer_list '' için alınmadı '', bir 'initializer_list 'ile eşleşmediği sürece, sonuç çıkarılmamış bir bağlamdır. Bir fark var (eğer derleyici aslında 0 {0,) 'dan {1, 2}' den '' 1 '' 2 '' sonucunu çıkarsa, (c) derleme yapmaz). –

+0

Cümle reworded, teşekkürler! –