2017-01-13 17 views
5

Mam następujących funkcji szablonu:Jaka jest różnica między std :: initializer_list <int> ({1,2,3}) i {1,2,3}?

template<typename T> void foo2(T t) {} 

wiem, że nie można nazwać go za pomocą:

foo2({1,2,3}); 

ponieważ lista inicjująca jest non wyprowadzoną kontekst dla szablonu argumentu. Muszę użyć:

foo2<std::initializer_list<int>>({1,2,3}); 

ale mogę również użyć:

foo2(std::initializer_list<int>({1,2,3})); 

co sprawia, że ​​zastanawiam się, jaka jest różnica pomiędzy: {1,2,3} i std::initializer_list<int>({1,2,3})?

+9

'std :: initializer_list ({1,2,3})' jest wyrażeniem typu 'std :: initializer_list '. '{1,2,3}' nie jest wyrażeniem. Lista usztywniona może występować tylko w kontekstach, które definicja języka wyraźnie pozwala na to, nie tylko w dowolnym miejscu, w którym może wystąpić wyrażenie. –

+2

@ M.M Gdy znasz odpowiedź na pytanie z 0 odpowiedziami, ale potem okazuje się, że odpowiedź została wyrażona w komentarzach. (͡ ° ʖ̯ ͡ °) – luk32

+2

@ luk32 Zapraszam do napisania odpowiedzi ... myślę, że pełna odpowiedź powinna obejmować szczegóły szablonu, który nie jestem tak pewien o –

Odpowiedz

7

A braced-init list nie jest wyrażeniem, a zatem nie ma typu. Podczas rozmowy telefonicznej

foo2({1,2,3}); 

kompilator nie wie, jaki rodzaj {1,2,3} reprezentuje w swoim umyśle, a więc nie skompilować.

foo2<std::initializer_list<int>>({1,2,3}); 

kompiluje bo tu kompilator nie musi wywnioskować typ, podałeś to, to jest std::initializer_list<int>. Może zainicjować t z {1,2,3}.

Trzecie połączenie również kompiluje, ponieważ kompilator może wywnioskować typ. std::initializer_list<int>({1,2,3}) to oczywiście std::initializer_list<int>, dzięki czemu może zainicjować t z przekazaną wartością prava.

+2

Pamiętaj, że w C++ 17 reguły "gwarantowanej elizacji" powodują, że twój ostatni akapit jest inny. W pewnym sensie nie ma już utworzonej tam wartości, która następnie zostałaby przeniesiona do argumentu funkcji; staje się sposobem inicjowania argumentu funkcji. Albo tak się gromadzę, muszę jeszcze opanować nowe zasady. (W praktyce nie ma żadnej różnicy w tym przypadku) – Yakk

Powiązane problemy