Index

Symbols

( ) (parentheses), 187

{} (curly braces), 144, 166

A

ABI (application binary interface), 2324

Abrahams, David, 280

abstract class, 101, 102

abstraction, 167, 302304

access

memory, 225229

nonexisting element of a std::string, 404

objects, 114117

sequence containers, 229

accounts, comparing, 326

accumulate algorithm, 166

acquire-release semantics, singletons, 218

ADL (argument-dependent lookup), 126, 314, 315316

algorithms, 8

Euclidean, 223

expressing, 304

function objects, 305307

gcd, 223225

generic programming, 301, 302. See also generic programming

parallel, 266

preference over raw loops, 201

std::accumulate, 166

std::transform_exclusive_scan, 269

STL (Standard Template Library), 12, 266

aliases

defining, 311

smart pointers, 162164

templates, 310, 311

ALL_CAPS, 134, 170171

allocation

memory, 147, 246

resource management, 145150

analysis, enabling code, 448

annotated graphs, 243

anonymous unions, 128129

application binary interface. See ABI (application binary interface)

architecture, 423425

code stability, 423

cycles among libraries, 425

expressing reusable parts as libraries, 424425

argument-dependent lookup. See ADL (argument-dependent lookup)

arguments

binary callables, 21, 22

defaults, 49, 113114

functions, 359

metafunctions, 343

order of evaluation, 195196

Regular type/SemiRegular type, 313314

template argument deduction, 313

templates, 359

va_arg, 4952

arithmetic

errors, 208210

rules, 204

signed/unsigned integers, 204208

array, 401403

arrays, deleting, 194

artificial scope, 144

assembler instructions, 30

assertions, 443

assignments

classes, 5960, 7880

copy-assignment operator, 221, 222

pointers, 117

auto, applying, 171172

automatic management of devices, 435, 449

automatic memory management, 398. See also memory

automatic type deduction, 179

availability of source code, 376377

B

bad functions, example of, 2829

Bartosz, Milewski, 276

base classes, 101

basic exception safety, 280

behaviors

default, 71

defining, 368

implementation-defined, 9

regular types, 58

shadowing, 111113

undefined, 9, 22, 42, 63, 234235. See also undefined behaviors

unspecified, 196

big six, 59, 60, 61, 85, 130, 222

binary callables, 21, 22

binding, late, 114

bit manipulation, 205

block scope, 166

Boost C++ Library, 280

boundaries, 282, 403404

bounds

errors, 403404

safety, 439

built-in types, 283285, 294

byte, 409

C

calculating (at compile time), 339341

callables

definition of, 21, 22

providing, 305

C-arrays

bounds errors, 403404

size of, 402

std::array instead of, 401403

std::vector instead of, 398400

case-sensitivity, 363

casts

avoiding, 197

naming, 198

Visual Studio compiler, 197

catch-clauses, ordering, 288

catch-fire semantics, 9

catching exceptions, 285286. See also exceptions

categories

types, 346349

C++ Core Guidelines, enforcing, 447452

chain operations, 42

characters

arbitrary, 44

character-level input, 411

owning sequences, 405406

std::string_view, 407408

termination, 405, 406

cheap operations, 33

Clang compiler, 172, 196197, 219

clang-tidy tool, 450452

classes

abstract, 101, 102

accessing, 56

assignments, 5960, 7880

base, 101

concrete types, 5859

constructors, 5960, 6678. See also constructors

copying, 69, 7883

declarations, 431

default arguments, 113114

default constructors, 6874

default operations, 6066, 8898

definitions of, 53

designing, 102117

destructors, 5960, 8388

dynamic-cast, 114117

enum, 133134

explicit actions, 84

functions, 55

hierarchies, 59, 98117, 331

implementation, 56

inheritance, 54

initializing, 71

invariant, 55

moving, 7883

non-dependent class template members, 323325

objects, 114117. See also objects

operators, 117126. See also operators

overloading, 111

Plmpl idiom, 2324

polymorphic, 8183

RAII (Resource Acquisition Is Initialization), 140142

resources, 84

special constructors, 7678

versus struct, 54

summary rules, 5458

unions, 126129

classical enumerations, 131, 132. See also enumerations

cleanup actions, 433435

clients, communication, 281

clone function, 103105

code. See also performance

abstraction, 302304

enabling analysis, 448

expressing ideas in, 8

expressiveness, 307

generic code based on templates, 10

messy, 12, 13

multi-threaded programs, 232234

null pointers, 192193

optimization, 354356

quality of, 167

repetition, 291

reusing, 232

source. See source code

stability, 423

unknown, 249250

writing, 223

wrong assumptions, 214218

common names, 169170

communication

error handling, 281282

functions, 2022

comparisons, 325330

type-traits library, 349351

compiler errors, 332, 387

Compiler Explorer, 30, 219

compilers, default operations, 6066

compile time, 338

calculating at, 338, 339341

checking, 10, 11

gcd algorithms, 223225

type manipulation at, 340341

complicated expressions, 186

composite type categories, 347348

concepts, 453456

concrete types, 5859

concurrency, 17, 231232, 245

data sharing, 257261

general guidelines, 232245

lock-free programming, 273276

locks, 246250

message passing, 269273

parallelism and, 232, 266269

resources, 261264

threads, 250257

validating, 238245

conditional execution, 360

condition variables, 254257

versus tasks, 272

without predicates, 257

configuring applied rules, 449

consistency

of default operations, 6366

initialization preferences, 76

const

casts, 199

correctness, 294

defining objects, 297298

member functions, 294296

constant expressions, 2930

functions, 357

templates, 356362

user-defined types, 357358

variables, 356

constants, 293298

enumerations, 133

initializers, 75

introducing, 176

magic, 190

symbolic, 190

constexpr, 2930, 298, 342

metaprogramming, 358

constructors

calling virtual functions, 9198

classes, 5960, 6678

conversion, 73

copy, 65

default, 6874

defining, 62

delegating, 76, 77

explicit, 121

inheriting, 7778

special, 7678

throwing exceptions, 68

containers, 23

expressing, 305

iterating through, 366

sequence, 229

STL (Standard Template Library), 60, 398404

threads as, 250251

context

minimizing dependencies, 320321

minimizing switching, 261

contracts, 457458

interfaces, 1516. See also interfaces

conventional usage, 118126

conversions

constructors, 121

decay, 117

expressions, 197199

implicit conversion operators, 122124

narrowing, 180182

copy-and-swap idiom, 9394

copy-assignment operator, 63, 221, 222

copy constructors, 65

copying, 42

classes, 69, 7883

deep copying, 80

parameters, 34

semantics, 8083

shallow copying, 80

copy-only type, 221

copy semantics, 12

core dumps, 44, 146

correctness, type-traits library, 353354

covariant return type, 103, 104

.cpp files, 384, 386387

CppMem, 241245

C-strings, 406

C-style programming, 375

availability of source code, 376377

entire source code not available, 378380

preference for C++, 375376

using interfaces for, 378380

curly braces (), 144, 166

cycles

breaking, 154156

of smart pointers, 154, 156

cyclic dependencies, 388390

D

data members

accessing specifiers, 105

non-const, 107

data races, 234235

in CppMem, 245

data sharing, concurrency, 257261

deadlocks, 248

deallocation, resource management, 145150

decay, 117

declaration

classes, 431

expressions, 168

functions, 427428

naming, 168169, 171

statements, 168

static_assert, 10

deduction

automatic type, 179

template argument, 311-312

deep copying, 80. See also copying

polymorphic classes, 103

=default, 8990

defaults

arguments, 49, 113114

behaviors, 71

constructors, 6874, 6974

operations, 6066, 8898

statements, 202204

=delete, 89, 9091

deleting

arrays, 194

destructors, 91

dependencies

avoiding, 390

cyclic, 388390

injection, 1820

minimizing context, 320321

non-dependent class template members, 323325

between special member functions, 61

deque, 226

dereferencing pointers, 191193, 194

design

classes, 102117

error handling, 281282

Gang of Four (GoF), 111

optimizations, 219222

Design Patterns: Elements of Reusable Object-Oriented Software (Gamma, Helm, Johnson, Vlissides), 111

destructors, 145

calling virtual functions, 9198

classes, 5960, 8388

defining, 84, 85

deleting, 91

failing, 88

need for, 83

nonvirtual, 87

protected, 87

public, 8687

virtual, 8687

detection

errors, 10

overflow, 208

deterministic, definition of, 437

devices, automatic management of, 435, 449

direct ownership, 286287

discriminated unions, 126

documentation, intention of, 9

don’t repeat yourself. See DRY (don’t repeat yourself)

do while loops, 199, 200

DRY (don’t repeat yourself), 49, 291, 364, 365

dynamic-cast, 114117

E

enable_if, 319320, 352, 356

enabling code analysis, 448

endl, 415418

enforcing rules, 447452

enumerations, 131137

ALL_CAPS, 134

constants, 133

enum class, 133134

enumerator values, 136

over macros, 132133

strongly typed enums, 131

underlying types, 135

unnamed, 134135

equality operators, 9496, 9798

equivalent operations, 124125

error handling, 279, 280281. See also errors

design, 281282

implementation, 283291

errors

arithmetic, 208210

bounds, 403404

with C++ compilers, 377

compilation, 174

compiler, 387

detecting, 10

run-time, 11

SFINAE (Substitution Failure Is Not An Error), 320, 352

single pointers and, 2223

static_assert declarations, 10

use-before-set, 177

Euclidean algorithm, 223

evaluation, order of, 150, 194195, 194196

exceptions

avoiding, 429431

basic exception safety, 280

catching, 285286

dynamic-cast, 116

error handling, 283. See also error handling

ordering catch-clauses, 288

purpose-designed user-defined types, 283285

safety, 280

sending, 270271

specifications, 287288

strong exception safety, 280

throwing, 68

execution

conditional, 360

metafunctions, 342

policies, 267

selecting, 243

single-threaded, 218

explicit constructors, 121

explicit sharing, minimizing, 236237

expressions, 165166, 186

complicated, 186

constant, 2930

conversions, 197199

general rules, 166168

magic constants, 190

operator precedence, 187

order of evaluation, 194195

pointers, 187190, 191193

range checking, 190191

statements, 148150

summation with fold, 51

expressiveness, 4647

function objects, 307

F

failing destructors, 88

failure transparency, 280

fallthrough, 201, 202

files

.cpp, 384, 386387

.h, 384, 385386, 388

header, 391, 393394

source. See source files

final, 102, 103

flushing, 415418

fold expressions, summation with, 51

for loops, 199, 200

format strings, 413414

for-statements, 168169

forwarding, perfect, 333335

forward_list, 226

forward parameters, 3436

forward std, 144, 198, 226

free, 145146

func, 39

function objects

advantages of, 307310

algorithms, 305307

as sorting criteria, 307

with state, 309

functions, 2728

ADL (argument-dependent lookup), 126

arguments, 359

callables, 21, 22

classes, 55

cleanup actions, 433435

clone, 103105

communication, 2022

constant expressions, 357

constexpr, 2930, 298, 342, 356

declarations, 427428

=default, 8990

defining, 368, 385

definitions, 2829

=delete, 89, 9091

dependencies between special member, 61

free, 145146

helper, 57

invariants for, 15

ISP (interface segregation principle), 100

lambdas, 46

main, 42

malloc, 145146

members, 56

metafunctions, 342345

naming, 2829

noexcept, 3031, 88

nonmember, 118122

order of evaluation, 195196

overloading, 379

parameter packs, 35, 51, 335, 336

parameters, 156159

passing parameters, 3238. See also parameters

printf, 413414

pure, 3132

refactoring, 29

return-statements in, 428429

as sorting criteria, 307

specialization of templates, 367372

std::move(local), 4546

struct, 55

swap, 9294

templates, 311313

unit tests, 18

virtual, 82, 102, 223, 331, 357

virtual clone member, 105

fundamental types, 176, 181

G

Gang of Four design. See GoF (Gang of Four) design

GCC compiler, 172, 174, 196, 197, 219, 354

gcd algorithm, 223225

general rules. See rules

generic code. See also code

templates, 10

generic programming, 301, 302

getters, 106

global containers, threads as, 250251

global scope, 176

global variables, non-const, 1617

GoF (Gang of Four) design, 111

graphs, annotated, 243

GSL (Guidelines Support Library), 441444

assertions, 443

ownership pointers, 442443

utilities, 443444

views, 441442

guarantees

evaluation order, 150, 196

exceptions, 280. See also exceptions

Guidelines Support Library. See GSL (Guidelines Support Library)

H

hardware/compiler combinations, 274276

Haskell, 32

header files, 391

unnamed namespaces, 394

using namespaces, 393394

helper functions, 57

.h files, 384, 385386

#include guard, 388

hiding

implementation details, 310

member functions, 174

hierarchies

catching exceptions, 285286

classes, 53, 59, 98117, 331. See also classes

equality operators, 9798

navigating, 115

templates, 330332

hints, compilers, 223

I

IILE (Immediately Invoked Lambda Expression), 183

Immediately Invoked Lambda Expression. See IILE (Immediately Invoked Lambda Expression)

immutable data, 12, 293298

implementation

classes, 56

error handling, 283291

hiding details, 310

inheritance, 98, 107111

Plmpl idiom, 2324, 109

singletons, 18

source files, 384391

templates with specializations, 325330

ThreadSanitizer, 239241

implementation-defined behavior, 9, 205

implicit conversion operators, 122124

in-class initializers, 75

inheritance

classes, 54

implementation, 98, 107111

interfaces, 107111

multiple, 107, 111

initialization, 177182

lambdas, 183184

objects, 175176

two-phase, 431433

variables, 175184

injection

dependency, 1820

inline, 30, 354, 357, 385

in-out parameters, 36

in parameters, 34

input/output. See I/O (input/output)

integers, signed/unsigned, 204208

interfaces, 1516

ABI (application binary interface), 2324

abstract classes, 101

applying classes, 56

base classes, 101

C-style programming, 378380

defining, 386387

dependency injection, 1820

function communication, 2022

functions, 2728. See also functions

inheritance, 107111

multiple inheritance, 111

non-const global variables, 1617

segregation principle, 100

single pointers, 2223

singletons, 1718

source files, 384391

templates, 305320

interface segregation principle. See ISP (interface segregation principle)

internal linkage, 394395

invariants

error handling, 282

for functions, 15

I/O (input/output)

character-level input, 411

iostreams, 413414

std::endl, 415418

STL (Standard Template Library), 411418

stream synchronization, 414415

iostreams, 411, 413414

ISO Standards, 8, 9

ISP (interface segregation principle), 100

iteration

statements, 199201

through containers, 366

iterator categories, 366367

J

jthread, 251253

K

keep it simple, stupid. See KISS (keep it simple, stupid)

keywords, overriding, 102

KISS (keep it simple, stupid), 59

Koenig lookup, 126, 314, 315316

L

lambdas, 46

initializing, 183184

overloading, 117

references, 47, 4849

as sorting criteria, 307

with state, 310

unnamed, 364365

languages

features, 167168

Haskell, 32

late binding, 114

leaks

memory, 287

resources, 11

libraries, 166. See also STL (Standard Template Library)

Boost C++ Library, 280

cycles among, 425

expressing reusable parts as, 424425

GSL (Guidelines Support Library), 441444

reusing code, 232

STL (Standard Template Library). See STL (Standard Template Library)

support, 13

type-traits, 345346, 351

life cycles of objects, 59

lifetimes

objects, 142

safety, 439

semantics, 157159

limiting scope, 168169

linker errors, 387

Linux systems

creation of threads, 262

flushing, 418

size of threads, 261

list, 226

literal type, 224

LoadLoad, 276

local names, 169170

local objects, 140, 141, 287. See also objects

lock-free programming, 273276

lock_guard, 264266

locks

concurrency, 246250

mutexes, 264

std::lock_guard, 264266

std::unique_lock, 264266

logical constness, 295

logical structure, expressing, 394

lookups, 126, 314, 315

loops, 199, 200

raw, 201

recursion versus, 360

lost wakeups, 255, 256

lvalue references, 4246

M

macros

enumerations over, 132133

statements, 184185

magic constants, 190

malloc, 145146

management

automatic management of devices, 435, 449

automatic memory management, 398

memory, 398, 405

resources, 139140. See also resource management

Martin, Robert C., 100

mathematical functions, 32. See also pure functions

member functions, 56

boundary-checking, 403404

compiler errors, 332

const, 294296

hiding, 174

reserve, 399

shadowing, 112

virtual member function templates, 331332

members

accessing specifiers for data, 105

declaring, 74

dependencies between special functions, 61

initializing, 7476, 75

ISP (interface segregation principle), 100

minimizing exposure, 58

non-dependent class template, 323325

nonpublic, 58

parameters, 321322

pointers, 85

variables, 75

memory

accessing, 225229

allocation, 147, 246

automatic memory management, 398

leaks, 287

management, 398, 405

models, 242

ROM (readonly memory), 29

saving, 126

sequence containers, 229

messages

as exceptions and values, 271

passing, 269273

messy code, 12, 13

metadata, templates, 341

metafunctions, templates, 342345

metaprogramming, 336356

constexpr function, 358

templates, 351

meta-rules. See philosophical rules

Metaware compiler, 338

Meyers singleton, 217

Microsoft Visual Studio Compiler, 30

minimizing

context dependencies, 320321

context switching, 261

thread creation/destruction, 261263

time locking mutexes, 264

models, memory, 242

modification versus new value, 359

most vexing parse, 177, 179

move(local) function, 4546

moving

classes, 7883

semantics, 8083

std::unique_ptr, 153

MSVC compiler, 172

multiple inheritance, 107, 111

multiple mutexes, acquiring, 247248

multi-threaded programs, 232234

mutable data, 12

mutexes

acquiring, 247248

locks, 264

MyGuard, 265

myths, 427436

N

naked unions, 127128

Named Return Value Optimization. See NRVO (Named Return Value Optimization)

names

ALL_CAPS, 170171

casts, 198

common names, 169170

conventions, 342

declarations, 168169, 171

expressions, 168185

functions, 2829

local names, 169170

mangling, 380

operations, 362364

redundancy, 171172

reusing names, 172175

similar names, 170

statements, 168185

templates, 314319

namespaces, 57

defining overloaded operators, 125126

source code, 391395

narrowing conversion, 180182

negative values, 206208

nested scopes, reusing names, 172175

NNM (No Naked Mutex), 246

NNN (No Naked New), 147, 246

noexcept, 30, 31, 79, 95

destructors, 88

function definition, 88

noexcept function, 3031, 88

no exception safety, 280

no-leak guarantee, 280

No Naked Mutex. See NNM (No Naked Mutex)

No Naked New. See NNN (No Naked New)

non-const data members, 107

non-const global variables, 1617

non-dependent class template members, 323325

nongeneric code, writing, 365367

nonmember functions, 118122

nonpublic members, 58

nonrules, 427436

nonvirtual, destructors, 87

normal parameter passing, 32

no-throw guarantees, 280

notifications

sending, 272273

with tasks, 273

NRVO (Named Return Value Optimization), 36, 37

NULL, 192

nullptr, 191193, 192193. See also pointers

O

objects

accessing, 114117

constructors creating, 67

creating, 145

defining, 297298, 385386

direct ownership, 286287

function objects. See function objects

immutable data and, 294

initializing, 175176

life cycles of, 59

lifetimes, 142

local, 140, 141

moving, 80

scoped, 143144

ODR (One Definition Rule), 385

One Definition Rule. See ODR (One Definition Rule)

operands, defining overloaded operators, 125126

operations

cheap, 33

equivalent, 124125

naming, 362364

naming functions, 2829

passing to algorithms, 305307

reordering, 276

operators

ADL (argument-dependent lookup), 126

conventional usage, 118126

copy-assignment, 221, 222

defining, 125126

equality, 9496, 9798

implicit conversion, 122124

overloading, 117126

precedence, 187

symmetric, 118122

optimization, 17

code, 167

design, 219222

enabling, 218229

type-traits library, 354356

wrong, 214

order of evaluation, expressions, 194195

out_of_range, 190, 403

out parameter, 52

output parameters, 3637

out values, 3738

overflow, 208

overloading, 49

ADL (argument-dependent lookup), 126

classes, 111

conventional usage, 118126

defining operators, 125126

functions, 379

function templates, 369370

implicit conversion operators, 122124

operators, 117126

override, 102

ownership

direct, 286287

pointers/references, 143, 442443

semantics, 3841

sharing, 164, 258261

std::shared_ptr, 151153

std::unique_ptr, 150151

P

packing parameters, 35

parallelism, concurrency and, 232, 266269

parameters

in, 34

forward, 3436

functions, 156159

in-out, 36

members, 321322

normal parameter passing, 32

out, 52

output, 3637

ownership semantics, 3841

packs, 35, 51, 335, 336

passing, 3238

value return semantics, 4246

Parent, Sean, 167

parentheses ( ), 187

passing

messages, 269273

pointers, 297

references, 297

passing parameters, 3238

normal parameter passing, 32

ownership semantics, 3841

value return semantics, 4246

perfect forwarding, 333335

performance, 213

enabling optimization, 218229

function objects, 307

measurements, 214

Meyers singleton, 217

wrong assumptions, 214218

wrong optimizations, 214

philosophical rules, 7

compile-time checking, 10

expressing ideas in code, 8

expressing intent, 9

immutable data, 12

messy code, 12, 13

resource leaks, 11

run-time checking, 11

run-time errors, 11

saving space and time, 1112

statically type safe programs, 10

supporting tools, 13

support libraries, 13

writing in ISO standard C++, 89

physical constness, 295

Pikus, Fedor, 274

Plain Old Data. See POD (Plain Old Data)

Plmpl idiom, 2324, 109

POD (Plain Old Data), 33

pointers, 4246, 84

assigning, 117

dereferencing, 191193, 194

dynamic-cast, 114, 115, 116

expressions, 187190, 191193

members, 85

null, 191193

passing, 162164, 297

Plmpl idiom, 2324, 109

raw, 85, 140, 143

rules, 191

single, 2223

smart, 150164

policy execution, 266, 267

polymorphic classes, 8183, 103

portably enforceable, definition of, 437

POSIX Threads, 256

postconditions, 15

power as function/metafunction, 345

pragma once, 388

preconditions, 15

predicates, condition variables without, 257

predictability, 225229

Preshing, Jeff, 276

primary type categories, 346349

principle of least astonishment, 118

printf function, 413414

profiles, 437439

Pro.boundsBounds safety, 439

Pro.lifetimeLifetime safety, 439

Pro.typeType safety, 438

programming

C-style, 375. See also C-style programming

generic. See generic programming

metaprogramming, 336356, 351, 358. See also metaprogramming

programs

multi-threaded, 232234

statically type safe, 10

property types, 348349

protected data, 106107, 436

protected destructors, 87

public destructors, 8687

pure functions, 3132. See also functions

purpose-designed user-defined types, 283285

Q

quality of code, 167

R

race conditions, 253

RAII (Resource Acquisition Is Initialization), 140142, 246, 264, 287, 288, 289

range checking, 190191

ranges, expressing, 305

raw loops, 201

raw pointers, 85, 140, 143

raw references, 143

read-only memory. See ROM (read-only memory)

recursion versus loop, 360

redundancy, naming, 171172

refactoring, 17, 29

references, 84, 140

catching exceptions, 285286

dynamic-cast, 114, 115, 116

lambdas, 47, 4849

to locals, 4244

lvalue, 4246

passing, 297

raw, 143

SemiRegular type, 315

universal, 334

referential transparency, 31

Regular, 313314

regular types, 58, 59

relations, enabling, 243

relaxed semantics, 275

reordering operations, 276

repetition of code, 291

reserve function, 399

Resource Acquisition Is Initialization. See RAII (Resource Acquisition Is Initialization)

resource management, 139140

allocation, 145150

deallocation, 145150

general rules, 140144

smart pointers, 150164

resources

concurrency, 261264

leaks, 11

ownership of, 39

return-statements in functions, 428429

Return Value Optimization. See RVO (Return Value Optimization)

return values

metafunctions, 343

simulations, 361

reusing

expressing reusable parts as libraries, 424425

operations, 362364

ROM (read-only memory), 29

rule of five, 61, 83, 84, 89

rule of six, 61

rule of zero, 60

rules

arithmetic, 204

class hierarchies, 99101

configuring applied, 449

enforcing, 447452

expressions, 166168

interfaces, 2022

NNN (No Naked New), 147

ODR (One Definition Rule), 385

passing parameters, 3238

philosophical, 7. See also philosophical rules

pointers, 191

resource management, 140144

statements, 166168

summary, 5458

templates, 362372

user-defined types, 53

running code analysis, 449

run time

calculating at, 343

checking, 10, 11

constant expression in ROM, 2930

errors, 11

gcd algorithms, 223225

RVO (Return Value Optimization), 36, 37

S

safety

basic exception, 280

bounds, 439

exceptions, 280

lifetimes, 439

types, 438

scoped enums, 131, 135, 137

scoped objects, 143144

scopes

block, 166

global, 176

limiting, 168169

reusing names, 172175

sizes, 168

selection statements, 201204

self-assignment, 7980

semantics

acquire-release, 218

catch-fire, 9

copy, 65

copying, 8083

copy-only type, 221

lifetime, 157159

moving, 8083

ownership, 3841

relaxed, 275

summary rules, 5458

value return, 4246

SemiRegular, 313314

sequence containers, 229

sequential consistency, 218, 243, 274, 275

setters, 106

SFINAE (Substitution Failure Is Not An Error), 320, 352

shadowing, 111113

shallow copying, 80. See also copying

sharing ownership, 258261

signed/unsigned integers, 204208

SIMD (Single Instruction, Multiple Data), 267

similar names, 170. See also naming

simulations, return values, 361

single-argument constructors, 7274

Single Instruction, Multiple Data. See SIMD (Single Instruction, Multiple Data)

single pointers, 2223

single return-statements in functions, 428429

single-threaded case, 218

singletons, 1718

six, rule of, 61

sizes

of C-arrays, 402

of chars with C++ compilers, 377

of enumerators, 136

of scopes, 168

of threads, 261

of vectors, 399, 400

slicing, 81

smart pointers, 150164

aliases, 162164

cycles of, 154

as function parameters, 156

lifetime semantics of, 157159

sharing ownership, 261

std::unique_ptr, 160162

software units, 281

source code

availability of, 376377

entire code not available, 378380

namespaces, 391395

source files, 383, 384

cyclic dependencies, 388390

implementation, 384391

interfaces, 384391

span, 10, 23, 52, 101

special constructors, 7678

specialization,

function templates, 367372

templates, 360

special member functions, 61

specifications, exceptions, 287288

spurious wakeups, 256

stability, code, 423

Standard Template Library. See STL (Standard Template Library)

state, function objects, 308310

statements, 165166, 199. See also declarations

defaults, 202204

definitions of, 166

expressions, 148150

for-statements, 168169

general rules, 166168

initializing variables, 175184

iteration, 199201

macros, 184185

naming, 168185

return-statements in functions, 428429

selection, 201204

switch, 201202

statically type safe programs, 10

static_assert declarations, 10

static type systems, 222223

std::forward, 144, 198, 226, 334

std::make_unique, 36, 148, 153, 334, 335

std::shared_ptr, 140, 151153

std::unique_ptr, 140, 146147, 150151

moving, 152

smart pointers, 160162

std::weak_ptr, 140, 154156

STL (Standard Template Library), 8, 21, 305, 397

algorithms, 8, 12, 266

containers, 23, 60, 398404

expressions, 166

I/O (input/output), 411418

RAII (Resource Acquisition Is Initialization), 140142

strings, 410

text, 404411

streams

state, 411413

synchronization, 414415

strings

accessing nonexisting element of, 404

format, 413414

owning character sequences, 405406

STL (Standard Template Library), 410

string_view, referring to character sequences, 407408

strong exception safety, 280

strongly typed enums, 131

Stroustrup, Bjarne, 169

struct, 55

case-sensitivity, 363

class versus, 54

structures, organizing data into, 5455

Substitution Failure Is Not An Error. See SFINAE (Substitution Failure Is Not An Error)

suffixes, .cpp, 384

summary rules, 5458

summation

with fold expressions, 51

with va_arg, 51

support

C-arrays, 403404

libraries, 13

tools, 13

Sutter, Herb, 274, 276

swap function, 9294

switch statements, 201202

symbolic constants, 190

symmetric operators, 118122

synchronization, 255

streams, 414415

volatile for, 238

sync_with_stdio, 404, 415

T

tagged unions, 128129

tasks

condition variables versus, 272

notifications with, 273

versus threads, 237238

Technical Report on C++ Performance, 430

templates, 301, 302

aliases, 310, 311

applying, 302305

argument deduction, 313

arguments, 359

constant expressions, 356362

defining, 320330

faking concepts, 319320

function objects. See function objects

functions, 311313

function template specialization, 367372

generic code, 10

hierarchies, 330332

implementations with specializations, 325330

instantiation, 338

interfaces, 305320

metadata, 341

metafunctions, 342345

metaprogramming, 336356, 351. See also metaprogramming

naming, 314319

parameter packs, 35, 51, 335, 336

Regular type, 313314

rules, 362372

specialization, 360

STL (Standard Template Library), 8

variadic, 332336

virtual member function, 331332

terminate, 88, 251, 252, 287

termination characters, 405, 406

testability, 16

text

STL (Standard Template Library), 404411

types of, 405

threads

concurrency, 250257

creation/destruction, 261263

detaching, 253

as global containers, 250251

joining, 250

passing data to, 257258

POSIX Threads, 256

sharing ownership, 258261

sizes of, 261

std::jthread, 251253

versus tasks, 237238

ThreadSanitizer, 239241

throwing exceptions, 68

direct ownership, 286287

troubleshooting, 288291

throwing functions, 3031. See also functions

tools, 238

clang-tidy, 450452

CppMem, 241245

supporting, 13

ThreadSanitizer, 239241

transform_exclusive_scan algorithm, 269

transform_reduce, 21, 22

transparency, referential, 31

troubleshooting throwing exceptions, 288291

two-phase initializations, 431433

typedef, defining aliases, 311

types

automatic type deduction, 179

built-in, 283285, 294

categories, 346349

concrete, 5859

copy-only, 221

fundamental, 176, 181

literal, 224

manipulation at compile time, 340341

modifying, 351352

properties, 348349

purpose-designed user-defined, 283285

regular, 58, 59

Regular, 313314

return, 103, 104

safety, 438

SemiRegular, 313314

static type systems, 222223

of text, 405

underlying, 135

unsigned, 205

user-defined, 357358

type-traits library, 345346

comparisons, 349351

correctness, 353354

metaprogramming, 351

modifying types, 351352

optimization, 354356

type categories, 346349

U

Uncle Bob, 100

undefined behaviors, 9, 22, 42, 63

core dumps, 146

C-strings, 405

data races, 234235

naked unions, 127

order of evaluation, 194195

printf function, 414

underflow, 208. See also overflow

underlying types, 135

unions, 126129

anonymous, 128129

discriminated, 126

naked, 127

saving memory, 126128

tagged, 128129

unique_lock, 264266

unit tests, 18

universal references, 334

unknown code, calling, 249250

unnamed enumerations, 134135

unnamed lambdas, 364365

unnamed namespaces, 394

unpacking parameters, 35

Unruh, Erwin, 337, 338

unsigned/signed integers, 204208

unspecified behavior, 196

use-before-set error, 177

user-defined types

constant expressions, 357358

rules, 53

using

defining aliases, 311

namespaces, 393394

utilities. See libraries; tools

V

va_arg arguments, 4952

value return semantics, 4246

values

declaring variables, 176177

enumerations. See enumerations

enumerator, 136

negative, 206208

out, 3738

return, 343

sending, 270271

Van Eerd, Tony, 274

variables

categories of, 235

condition, 254257. See also condition variables

constant expressions, 356

declaring, 57

global, 1617. See also global variables

initializing, 175184, 176

introducing, 176

member, 74

mutable, 296

naming, 169170

purposes of, 182183

variadic templates, 332336

vector, 398400, 402403

vectorization, 267

vectors, size of, 399, 400

views, 441442

virtual, 82, 223, 331, 357

virtual clone member function, 105

virtual destructors, 8687

virtual functions, 102

calling, 9198

clone, 105

default arguments, 113-114

reasons for, 105

virtuality, 102105

virtual member function templates, 331332

visibility, modifying, 175

Visual Studio

casts, 197

enforcing C++ Core Guidelines, 448450

volatile for synchronization, 238

W

wakeups

lost, 255

spurious, 256

warnings with C compilers, 376

while loops, 199, 200

Williams, Anthony, 274, 276

Windows systems

creation of threads, 262

flushing, 418

size of threads, 261

writing

code, 223

in ISO standard C++, 89

nongeneric code, 365367

wrong assumptions, 214218

wrong optimizations, 214

Y

YAGNI (you aren’t gonna need it), 424

Z

The Zen of Python, 198, 364, 365

zero. See also arithmetic

dividing by, 210

rule of, 60