';

Inicjalizacja z użyciem nawiasów klamrowych w C++14

Inicjalizacja z użyciem nawiasów klamrowych w C++14

Od standardu jedenastego języka C++ wprowadzono nową składnię inicjalizacji zmiennych, która unifikuje wszystkie dotychczasowe sposoby inicjalizacji. Wykorzystuje ona nawiasy klamrowe w następujących formach: {} lub = {}.

Czym inicjalizacja z użyciem {} różni się od użycia (), bądź przypisania? Przede wszystkim jest bezpieczniejsza, bo wraz z inicjalizacją przeprowadzane jest statyczna ochrona przed zwężeniem typu (ang. narrowing conversion). Jest też jednoznaczna – w przeciwieństwie do pozostałych form – i rozwiązuje problem specyficznego przykładu ambiwalentności w języku C++, które Scott Meyers nazwał tytułem most vexing parse.

Czym jest owe most vexing parse? Rozważmy następującą linię kody:

Class name(Class());

Dla kompilatora linia ta jest niejednoznacza. Może ją rozwiązać na dwa sposoby:
1. Definicja zmiennej name klasy Class zainicjalizowana instancją anonimową Class().
2. Deklaracja funkcji name zwracającej typ Class i przyjmującej parametr będący wskaźnikiem na funkcję zwracającą Class.

Pisząc kod:

Class name{Class()};

Problem niejednoznaczności zostaje rozwiązany – linia kodu jest definicją zmiennej.

Używając C++14, należy jednakże uważać na inicjalizację nawiasami klamrowymi {} zmiennych typu auto. Przyjrzyjmy się poniższym liniom kodu:

auto var1 {1};
auto var2 = {1};

Jakich typów są zmienne var1 i var2? Odpowiedź jest zaskakująca, bo w obu przypadkach typem zmiennej jest std::initializer_list<int>. W C++14 zmienne auto zainicjalizowane z użyciem {} lub ={} rozwiązywane są do typu std::initializer_list.

Dopiero od standardu siedemnastego, inicjalizacja klamrowa zmiennych auto zostaje przedefiniowana. Zmienne zainicjalizowane przy użyciu {} otrzymają typ wydedukowany na podstawie wartości w nawiasach. Jeśli jednak użyjemy ={}, typem zawsze będzie std::initializer_list.

Literatura:
1. cppreference.com, online reference for the C and C++ languages and standard libraries, 2017 , https://en.cppreference.com/w/cpp/language/auto
2. Scott Meyers, Effective Modern C++, ISBN: 978-1-491-90399-5, O’Reilly, 2015
3. Bjarne Stroustrup, Herb Sutter, C++ Core Guidelines, 2017

 

Komentarzy
Udostępnij
Piotr Tański

Wszechstronny i doświadczony programista i projektant oprogramowania. Certyfikowany programista języka C, ekspert języka C++. Prywatnie - pasjonat nowoczesnych technologii i podróży. Zwiedził już wiele miejsc na świecie i ciągle mu mało! Poza tym, fan piłki nożnej, pieszych wycieczek i muzyki rockowej. Stara się też na bieżąco poszerzać wiedzę z historii.

Ten wpis skomentowano 1 raz
  1. Dawid
    Luty 12, 2019, 7:37 am

    Zwięźle i rzeczowo. Poproszę o więcej takich artykułów.

Skomentuj

pl_PLPolski
en_GBEnglish (UK) pl_PLPolski