Spis treści
0. Proszę tego nie czytać! 1
0.1. Wyruszamy na kolejną wyprawę! 1
1. Szablony o zmiennej liczbie parametrów 3
1.1. Szablon funkcji o zmiennej liczbie parametrów (i argumentów) 4
1.2. Jak dobrać się do argumentów tkwiących w pakiecie? 11
1.2.1. Ciekawe szablony zwracające rezultat 16
1.3. Szablon klas o dowolnej (zmiennej) liczbie parametrów 18
1.4. Trzy rodzaje pakietów parametrów szablonu 24
1.4.1. Pakiet szablonu będący pakietem wartości 25
1.5. Argumenty pakietu odbierane przez wartość, referencję, adres 30
1.6. Rozwinięcie według wzorca (czyli rozwinięcie „z kontekstem”) 31
1.7. Rozwinięcie pakietu typów w klamrowej liście inicjalizatorów 34
1.7.1. Łatwe narzędzie do wypisania argumentów 34
1.8. Rozwinięcie pakietu na liście parametrów aktualnych innego szablonu 36
1.9. Gdzie można umieścić wyrażenia rozwijające pakiet parametrów 39
1.10. Ćwiczenia 39
2. Cechy języka wprowadzone do standardu C++14 43
2.1. Zapis dwójkowy stałych dosłownych 43
2.2. Separatory cyfr w stałych dosłownych 44
2.2.1. Wypisywanie liczb w postaci binarnej 45
2.2.2. Wczytywanie liczb dwójkowych strumieniem wejściowym 48
2.3. Kompilator rozpoznaje typ rezultatu funkcji 50
2.4. Deklaracja typu rezultatu decltype(auto) 52
2.4.1. Przykład zastosowania konstrukcji decltype(auto) w szablonie funkcji 55
2.5. Szablon definicji zmiennej 59
2.5.1. Jak to drzewiej bywało, czyli świat bez szablonów zmiennych 64
2.5.2. Teraz zobaczysz, jak prosto się to robi z C++14 71
2.5.3. Ciekawe zastosowanie: sprawdzenie cech charakteru danego typu 72
2.5.4. Lubię, nie lubię... 77
2.5.5. Dwa usprawnienia 80
2.5.6. Realizacja tego pomysłu w programie 81
2.6. Przeładowanie globalnych operatorów new, new[ ], delete i delete[ ] 86
2.7. Nowości C++14 w wyrażeniach lambda 94
2.7.1. Przykład uogólnionego wyrażenia lambda 94
2.7.2. Przykład definicji obiektu na liście wychwytywania i jego inicjalizacja 96
2.7.3. Przykład wychwycenia na zasadzie przeniesienia (move) 99
2.8. C++14 a funkcje constexpr 104
2.8.1. Zniesienie wielu ograniczeń w ciele funkcji constexpr 104
2.8.2. Funkcje składowe constexpr w C++14 nie są już automatycznie const 110
2.9. Atrybuty 111
2.9.1. Nowy atrybut [[deprecated]] wprowadzony w C++14 112
2.9.2. Oznaczenie wybranej funkcji jako przestarzałej 113
2.9.3. Argument funkcji uznany za przestarzały 114
2.9.4. Przestarzałe niestatyczne składniki klasy: funkcja składowa i dana składowa 114
2.9.5. Obiekt oznaczony jako przestarzały 115
2.9.6. deprecated a zbiorcza definicja kilku zmiennych (z ewentualną inicjalizacją) 116
2.9.7. Typy, które uznajemy za przestarzałe 116
2.9.8. Przestarzałe synonimy typów (w instrukcjach typedef i using) 118
2.9.9. Oznaczanie atrybutem [[deprecated]] specjalizacji szablonu klasy 118
2.9.10. Oznaczanie atrybutem [[deprecated]] specjalizacji szablonu funkcji 119
2.10. Przewrotu nie było 119
2.11. Ćwiczenia 120
3. Cechy języka wprowadzone do standardu C++17 123
3.1. Specyfikacja wyjątków staje się częścią typu funkcji 123
3.2. Technika „pomijanie kopiowania” bywa teraz obowiązkiem kompilatora 128
3.3. Przydomek alignas a operatory new i delete 134
3.3.1. Przeładowanie globalnych new i delete uwzględniające wyrównanie adresów 135
3.3.2. Jak przeładować wyrównujące operatory new/delete na użytek wybranej klasy 141
3.4. Porządek obliczania składników w złożonych wyrażeniach – nareszcie ustalony 144
3.5. Stała znakowa typu u8 146
3.6. Szesnastkowy zapis liczb zmiennoprzecinkowych 147
3.6.1. Wypisywanie i wczytywanie zmiennoprzecinkowych liczb szesnastkowych 149
3.7. Wyrażenia poskładane w harmonijkę – ułatwienie pracy z pakietem argumentów 152
3.7.1. Pierwszy przykład użycia wyrażenia harmonijkowego w szablonie 152
3.7.2. Harmonijka z dodatkowym wyrażeniem początkowym 155
3.7.3. Cztery formy wyrażenia harmonijkowego 157
3.7.4. Kontekst wyrażenia harmonijkowego – przykład 159
3.8. Dozwolone słowo auto w deklaracji template
161
3.9. Kompilator rozpoznaje typ parametrów klasy szablonowej 166
3.9.1. Wektory czego innego niż widać 170
3.10. Instrukcja if constexpr – prawie jak kompilacja warunkowa 173
3.10.1. Instrukcja if constexpr rozwiązuje problem „lubianych” i „nielubianych” typów 176
3.11. Wyrażenia inicjalizujące w instrukcjach if i switch 179
3.12. Dowiązania strukturalne, czyli łatwe „sięganie do składników” 182
3.12.1. Dowiązanie do tablic zbudowanych na bazie klasy std::array 184
3.12.2. Łatwe sięganie do składników struktur/klas 185
3.12.3. Przystosowanie naszej klasy do obsługi deklaracji dowiązań 192
3.12.4. Przystosowanie cudzej klasy do obsługi deklaracji dowiązań 198
3.13. Operator preprocesora zwany has_include 201
3.14. Nowe atrybuty: maybe_unused, fallthrough i nodiscard 203
3.14.1. Atrybut [[maybe_unused]] 205
3.14.2. Atrybut [[fallthrough]] używany w instrukcji switch 208
3.14.3. Atrybut [[nodiscard]] – nie zlekceważ mnie 210
3.15. Typ std::byte do operacji na surowych blokach pamięci 213
3.16. Modyfikacje istniejących cech języka 222
3.17. Rozluźnienie zasady inicjalizowania typów wyliczeniowych 223
3.18. Modyfikacja deklaracji static_assert 224
3.19. Prostszy sposób zapisu zagnieżdżonych przestrzeni nazw 225
3.20. Dozwolone słowo typename w parametrze określającym inny szablon 229
3.21. Dla zakresowej pętli for funkcje begin i end mogą zwracać odmienne typy 233
3.22. Rozwinięcie pakietu możliwe nawet w deklaracji using 239
3.23. Nowe zasady auto-rozpoznawania typu obiektów mających inicjalizację klamrową 245
3.24. W C++17 agregat może być nawet klasą pochodną 247
3.25. Zmiana typu rezultatu funkcji std::uncaught_exception 250
3.26. Ćwiczenia 254
4. Posłowie – czyli C++20 ante portas 264
Skorowidz 265
!
__PRETTY_FUNCTION__ 8
__has_include 201-202
A
agregat
może być klasa pochodną (C++17) 247-249
align_val_t 136
alignas
a operatory new i delete 134-143
w przeładowanych new i delete dla klasy 141
aligned_alloc (std::) - funkcja bibliot. 140, 144
apostrof
jako separator cyfr 44
argument
funkcji
deprecated 114
array - klasa (std::) 184
atrybut 111-118
carries_dependency 112
deprecated 112
fallthrough 203-212
maybe_unused 203-212
nodiscard 203-212
noreturn 111
auto
rozpoznaje typ rezultatu funkcji 50-51
rozpoznawanie w inicjalizacji klamrowej 245-246
w argumencie wyrażenia lambda 96
w deklaracji template auto 161-165
B
biblioteka
szablonów 4
binarny zapis stałych dosłownych 43
bitset (std::) - klasa biblioteczna 46, 217
byte (std::) - klasa biblioteczna 223
byte (std::) - klasa biblioteczna 213-221
C
C++14 - nowe cechy języka 43-122
C++17 - nowe cechy jezyka 123-263
carries_dependency - atrybut 112
class
deprecated 116
constexpr
a szablon zmiennej 61
funkcja składowa w C++14 110
funkcja w C++11 104
funkcja w C++14 104-110
D
dana składowa
deprecated 114
decltype
użyte w parametrze szablonu 161
decltype(auto)
deklaracja typu rezultatu 52-58
nie używać w alternatywnej deklaracji funkcji 55
w szablonie funkcji 55
declval (std::) 197
defaultfloat manipulator 150
deklaracja
dostepu 284
dowiązań
funkcja get 193, 195
klasa std::tuple_element 193, 196
przystosowanie klasy cudzej 198
przystosowanie klasy swojej 192
std::tuple_size 193, 196
delete
a alignas 134-143
globalny, przeładowanie 86-93
a alignas 135
z alignas
przeładowanie w klasie 141
deprecated
argument funkcji 114
atrybut 112
class, enum 116
funkcja 113
funkcja składowa i dana składowa 114
obiekt 115
specjalizacji szablonu 118
typedef, using 118
z zbiorcza definicja zmiennych 116
dostęp
wybiórczo 284
dostępu
deklaracja 284
dowiązanie strukturalne 182-200
a const i volatile 183
do elementów klasy std::array 184
do obiektów klas i struktur 185
gdzie stosowaæ 191
jako referencja l-wartości lub r-wartości 190
jako referencji do l-wartości 183
jako referencji do r-wartości 183
dwójkowe liczby wczytane strumieniem 48
dwójkowy zapis
a klasa bitset 46
stałych dosłownych 43
E
enum
deprecated 116
F
fallthrough - atrybut 208
false_type (std::)
pomocniczy typ biblioteczny 80
free()
fun. bibl. do zwalniania pamięci 87
funkcja
a noexcept 123-127
auto rozpoznanie typu rezultatu 50-51
constexpr
w C++11 104
w C++14 104-110
constexpr w C++14 105
decltype(auto) jako typ rezultatu 52-58
deprecated 113
składowa
constexpr w C++14 110
derpecated 114
specyfikacja wyjątków 123-127
G
gl-wartość 134
H
harmonijka 152-160
składana w lewo 154
składana w prawo 154
z wyrażeniem początkowym 155
has_include (__has_include) 201-202
hexfloat, manipulator 149
I
if - instrukcja sterujaca
z wyrażeniem inicjalizującym 179-181
if constexpr 16, 173-178
w szablonie 16
inicjalizacja
agregatowa 247
bezpośrednia 245
zmiana w standardzie C++17 246
kopiująca 245
w instrukcjach if oraz switch 179-181
zbiorcza 247
inicjalizator
klamrowy
auto rozpoznawanie jego typu 245-246
is_const 174
is_integral 174
is_pointer 174
is_unsigned 174
K
kompilacja warunkowa
a instrukcja if constexpr 173-178
kontekst
rozwnięcia pakietu 31-33
wyrażenia harmonijkowego 157, 159
konwersja
chwilowo materializujaca 134
L
lambda (wyrażenie)
uogólnione 94
wychwycenie obiektu na zasadzie przeniesienia (move) 99
lista wychwytywania
na niej definicje obiektów lokalnych 96
M
makrodefinicja
__PRETTY_FUNCTION__ 8
malloc (std::) 87
manipulator
hexfloat 149
maybe_unused - atrybut 205
move 102
N
new
a alignas 134-143
globalny, przeładowanie 86-93
a alignas 135
z alignas
przeładowanie w klasie 141
niby-rekurencja 14
nodiscard - atrybut 210
noexcept
w typie funkcji 123-127
noreturn - atrybut 111
nothrow_t 136
O
obiekt
deprecated 115
operator
decltype
użyty w parametrze szablonu 161
delete
globalny, przeładowanie w C++14 86-93
sizeof... 8
P
pakiet argumentów sz. funkcji 6
a wskażniki z przydomkami const 31
a wyrażenia harmonijkowe 152-160
jak dobrać się do argumentów 11-17
odbierane arg. przez wart., ref., adres 30
rozwnieta postać 7, 152
z referencjami l-wartości 30
z referencjami obiektów stałych 31
z referencjami r-wartości 30
ze wskaźnikami 31
pakiet argumentów szablonu
rozwinięcie z kontekstem 31-33
pakiet parametrów szablonu 6
będących nazwami innych szablonów 24
będących typami 24
bedących wartościami 24-25
trzy rodzaje 24-29
pakietu rozwinięcie
gdzie może wystąpić 39
w nazwie innego szablonu 36-38
z operatorem przecinek 36
parametr
szablonu określający inny szablon 229-232
podwalina typu wyliczeniowego 214
pomijanie kopiowania 128-133
porządek obliczania składników wyrażeń 144-145
postfix wyrażenia 145
pr-wartość 134
PRETTY_FUNCTION 8
printf 87
przecinek (operator)
a rozwinięcie pakietu 35
przestrzeń nazw
a zagnieżdżenie
nowy zapis w C++17 225-228
przeładowanie
globalnych new, delete 86-93
operatora
delete globalnego w C++14 86-93
puts 87
R
rekurencja 11, 14, 52
niby-rekurencja 14
rozwinięcie pakietu
argumentów 7
dwukrotne 33
gdzie może wystapić? 39
na liście inicjalizacyjnej konstruktora 23
na liscie parametrów aktualnych innego szablonu 36-38
na liście pochodzenia klasy 22
równoważne 33
typów w { } 34-35
w deklaracji using 239-244
z kontekstem 31-33
zapętlone 33
rozwinięta postać
argumentów szablonu 10
pakietu 13, 152
S
separatory cyfr w stałych dosłownych 44-49, 148
silnia 108
sizeof... 8
specjalizacja
deprecated 118
szablonu o zmiennej liczbie parametrów 23
szablonu zmiennej 63
specyfikacja wyjątków
w C++17 123-127
sprytny wskaźnik
unique_ptr 99
static_assert
modyfikacja w C++17 224
stała
dosłowna
z separatorami cyfr 44-49
zapisana dwójkowo 43
znakowa typu u8 146
std::array 184
std::false_type - pomocniczy typ 80
std::strtod 151
std::true_type - pomocniczy typ 80
std::unique_ptr 99
stdio 87
strtod - funkcja biblioteczna 151
strumienie a separatory cyfr 45
switch
z wyrażeniem inicjalizującym 179-181
szablon definicji zmiennej 59-85
szablon funkcji
deprecated 119
zmienna liczba parametrów 4-10
szablon klas
deprecated 118
o zmiennej liczbie parametrów 18-23
szablon zmiennej 59-85
a constexpr i const 61
przykład zastosowania 72
specjalizacja 63
szablony
o zmiennej liczbie parametrów 3-42
szesnastkowy
zapis liczb zmiennoprzecinkowych 147-151
wypisyw. i wczyt. ich strumieniami 149
T
Taylora wzór 108
template auto 161-165
to_integer (std::) - funkcja biblioteczna 214, 217
to_ulong (std::) - funkcja biblioteczna 50
true_type (std::)
pomocniczy typ biblioteczny 80
trygonometryczne tablice 110
tuple_element (std::) 193, 196
tuple_size (std::) 193, 196
typ
deprecated 116
wyliczeniowy enum
jego inicjalizacja liczb¹ 223
typedef
deprecated 118
typename 229-232
U
uncaught_exception (std::) zmiana typu rezultatu (C++17) 250-253
uogólnione
wyrażenie lambda 94
using
deklaracja
z rozwinięciem pakietu klas podst. 239-244
deprecated 118
V
valgrind - program diagnostyczny 86
W
wielodziedziczenie 239
wielokropek
w deklaracji argumentów fun. 6
w ostrym nawiasie 6
w wyrażeniu rozwijającym 32
wybiórcze udostępnianie 284
wychwycenie obiektu na zasadzie przeniesienia (move) 99
wyrażenia
końcówkowe 145
postfix 145
złożone
porządek ich obliczania 144-145
wyrażenia harmonijkowe 152-160
cztery formy 157
tzw. kontekst 159
wyrażenie
incjalizujące
w instrukcjach if oraz switch 179-181
lambda
uogólnione 94
X
x-wartoϾ 134
Z
zagnieżdżona
przestrzeń nazw - nowy zapis C++17 225-228
zakresowe for
a funkcje begin, end - wg zasad C++17 233-238
jak w C++11, adaptować klasę 233
jak w C++17, adaptować klasę 234
zapis dwójkowy
stałych dosłownych 43
znakowa stała u8 146