C++11 - the new ISO C++ standard

Modified August 19, 2016

This document is written by and maintained by
Bjarne Stroustrup.
Constructive comments, corrections, references, and suggestions are of course most welcome.
Currently, I'm working to improve completeness and clean up the references.

I have contributed to the new, unified,
isocpp.org C++ FAQ
maintained by
The C++ Foundation
of which I am a director.
The maintenance of this FAQ is likely to become increasingly sporatic.

C++11 is the ISO C++ standard ratified in 2011.
The previous standard is often referred to as
C++98 or C++03;
the differences between C++98 and C++03 are so few and so technical that they ought not concern users.

A late
working paper
is available.
This is close to the final draft international standard
formally accepted by a 21-0 national vote in August 2011.

Before its official ratification, we called the upcoming standard C++0x.
I have not had the time to update the name consistently,
sorry, and anyway I like the name C++0x :-).
The name "C++0x" is a relict of the days where I and others, hoped for a C++08 or C++09.
Think of 'x' as hexadecimal (i.e., C++0B == C++11).

All official documents relating to C++11/C++0x can be found at the
ISO C++ committee's website.
The official name of the committee is SC22 WG21.

Caveat: This FAQ will be under construction for quite a while.
Comments, questions, references, corrections, and suggestions welcome.

Purpose

The purpose of this C++11 FAQ is

To give an overview of the new facilities (language features and standard libraries)
offered by C++11 in addition to what is provided by the previous version of the ISO C++ standard.

To give an idea of the aims of the ISO C++ standards effort.

To present a user's view of the new facilities

To provide references to allow for a more in depth study of features.

To name many of the individuals who contributed
(mostly as authors of the reports they wrote for the committee).
The standard is not written by a faceless organization.

Please note that the purpose of this FAQ is not to provide comprehensive discussion of
individual features or a detailed explanation of how to use them.
The aim is to give simple examples to demonstrate what C++11 has to offer (plus references).
My ideal is "max one page per feature" independently of how complex a feature is.
Details can often be found in the references.

What do you think of C++11?

That's a (to me) amazingly frequent question.
It may be the most frequently asked question.
Surprisingly, C++11 feels like a new language:
The pieces just fit together better than they used to and I find a higher-level style of programming more natural
than before and as efficient as ever.
If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.
The abstractions are simply more flexible and affordable than before.
Rely on the old mantra:
If you think of it as a separate idea or object, represent it directly in the program;
model real-world objects, and abstractions directly in code.
It's easier now:
Your ideas will map to
enumerations,
objects,
classes (e.g. control of defaults),
class hierarchies (e.g. inherited constructors),
templates,
aliases,
exceptions,
loops,
threads,
etc., rather than to a single "one size fits all" abstraction mechanism.

My ideal is to use programming language facilities to help programmers think differently about system design and implementation.
I think C++11 can do that - and do it not just for C++ programmers but for programmers used to a variety of modern
programming languages in the general and very broad area of systems programming.

In other words, I'm still an optimist.

When will C++11 be a formal standard?

It is now!
The first draft for formal comments was produced in September 2008.
The Final International Draft standard (FCD) unanimously approved by the ISO C++ committee on March 25, 2011.
It was formally approved by a 21-0 national vote in August 2011.
The standard was published this year (2011).

Following convention, the new standard is called C++11 (because it was published in 2011).
Personally, I prefer plain C++ and to use a year marker only when I need to distinguish it from
previous versions of C++, such as ARM C++, C++98 and C++03.
For a transition period, I still use C++0x in places.
Think of 'x' as hexadecimal.

When will compilers implement C++11?

Currently shipping compilers (e.g. GCC C++, Clang C++,IBM C++, and Microsoft C++)
already implement many C++11 features.
For example, it seems obvious and popular to ship all or most of the new standard libraries.

I expect more and more features to become available with each new release.
I expect to see the first complete C++11 compiler sometime in 2012,
but I do not care to guess when such a compiler ships or when every compiler will provide all of C++11.
I note that
every C++11 feature has already been implemented by someone somewhere so there is implementation
experience available for implementers to rely on.

When will the new standard libraries be available?

Initial versions of the new standard libraries are currently
shipping with the GCC,
Clang
and Microsoft implementations,
and are available from
boost.

What new language features does C++11 provide?

You don't improve a language by simply adding every feature that someone considers a good idea.
In fact, essentially every feature of most modern languages has been suggested to me for C++
by someone: Try to imagine what the superset of C99, C#, Java, Haskell, Lisp, Python, and Ada would look like.
To make the problem more difficult, remember that it is not feasible to eliminate older features, even if
the committee agrees that they are bad: experience shows that users force every implementer to keep providing
deprecated and banned features under compatibility switches (or by default) for decades.

To try to select rationally from the flood of suggestions we devised a
set of specific design aims.
We couldn't completely follow them and they weren't sufficiently complete to guide the
committee in every detail (and IMO couldn't possible be that complete).

What new standard libraries does C++11 provide?

I would have liked to see more standard libraries.
However, note that the standard library definition is already about 70% of the normative text of the standard
(and that doesn't count the C standard library, which is included by reference).
Even though some of us would have liked to see many more standard libraries,
nobody could claim that the Library working group has been lazy.
It is also worth noting that the C++98 libraries have been significantly improved through the use of new
language features, such as
initializer-lists,
rvalue references,
variadic templates,
noexcept, and
constexpr.
The C++11 standard library is easier to use and provides better performance that
the C++98 one.

What were the aims of the C++11 effort?

C++
is a general-purpose programming language with a bias towards systems programming that

is a better C

supports data abstraction

supports object-oriented programming

supports generic programming

The overall aims of the C++11 effort was to strengthen that:

Make C++ a better language for systems programming and library building --
that is, to build directly on C++'s contributions to programming,
rather than providing specialized facilities for a particular sub-community
(e.g. numeric computation or Windows-style application development).

Make C++ easier to teach and learn --
through increased uniformity, stronger guarantees, and facilities supportive of novices
(there will always be more novices than experts).

Naturally, this is done under very stringent compatibility constraints.
Only very rarely is the committee willing to break standards conforming code,
though that's done when a new keyword
(e.g. static_assert,
nullptr,
and constexpr) is introduced.

What specific design aims guided the committee?

Naturally, different people and different organizations involved with the standardization
have somewhat different aims, especially when it comes to details and to priorities.
Also, detailed aims change over time.
Please remember that the committee can't even do all that everyone agrees would be good things
-- it consists of volunteers with very limited resources.
However, here are a set of criteria that has seen real use in the
discussion of which features and libraries were appropriate for C++11:

Maintain stability and compatibility
-- don't break old code, and if you absolutely must, don't break it quietly.

Prefer libraries to language extensions
-- an ideal at which the committee wasn't all that successful;
too many people in the committee and elsewhere prefer "real language features."

This list is likely to be incomplete -- and likely to frequently go out of date as people write new papers.
If you find a paper that ought to be here and is not, please send it.
Also, not all papers will be completely up-to-date with the latest improvements of the standard.
I'll try to keep comments current.

Where else can I read about C++11?

The amount of information about C++11 is increasing as the standard nears completion and C++ implementations start
providing new language features and libraries.
Here is a short list of sources:

Are there any videos about C++11?

(To people who know me, this is a proof that this really is an FAQ, rather than a series of my own favorite questions;
I'm not a fan of videos on technical topics -- I find the video distracting and the verbal format too likely to contain minor technical errors).

Is C++11 hard to learn?

Well, since we can't remove any significant features from C++ without breaking large amounts of code, C++11 is larger
than C++98, so if you want to know every rule, learning C++11 will be harder. This leaves us with just two tools for
simplification (from the point of view of learners):

Obviously, a "bottom up" teaching/learning style will nullify any such advantage, and there are currently (obviously) very little
material that takes a different approach.
That ought to change with time.

How does the committee operate?

The ISO Standards committee, SC22 WG21, operates under the ISO rules for such committees.
Curiously enough, these rules are not standardized and change over time.

Many countries have national standards bodies with active C++ groups.
These groups hold meetings, coordinate over the web, and some send representatives to the ISO meetings.
Canada, France, Germany, Switzerland, UK, and USA are present at most meetings.
Denmark, the Netherlands, Japan, Norway, Spain, and others are represented in person less frequently.

Much of the work goes on in-between meetings over the web and the results are recorded as numbered committee papers on
the WG21 website.

The committee meets two to three times a year for a week each time.
Most work at those meetings are in sub-working groups, such as "Core", "Library", "Evolution", and "Concurrency."
As needed, there are also in-between meetings of ad-hoc working groups on specific urgent topics,
such as "concepts" and "memory model."
Voting takes place at the main meetings.
First, working groups hold "straw votes" to see if an issue is ready for presentation to the committee as a whole.
Then, the committee as a whole votes (one member one vote) and if something is accepted the nations vote.
We take great care that we do not get into a situation where the majority present and the nations disagrees
-- proceeding if that is the case would guarantee long-term controversy.
Final votes on official drafts are done by mail by the national standards bodies.

The committee has formal liaison with the C standards group (SC22 WG14) and POSIX,
and more or less formal contacts with several other groups.

Who is on the committee?

The committee consists of a large number of people (about 250) out of whom 90+ turn up at the week-long
meetings two or three times a year.
In addition there are national standards groups and meetings in several countries.
Most members contribute either by attending meetings, by taking part in
email discussions, or by submitting papers for committee consideration.
Most members have friends and colleagues who help them.
From day #1, the committee has had members from many countries and at every meeting people from half a dozen to a dozen
countries attend.
The final votes are done by about 20 national standards bodies.
Thus, the ISO C++ standardization is a fairly massive effort, not a small coherent group of people working to
create a perfect language for "people just like themselves."
The standard is what this group of volunteers can agree on as being the best they can produce that all can live with.

Naturally, many (but not all) of these volunteers have day jobs focused on C++: We have compiler writers, tool builders,
library writers, application builders (too few of those), researchers (only a few), consultants, test-suite builders, and more.

You can get a better impression of the breath and depth of expertise involved by examining the author lists on the
WG21 papers,
but please remember there are major contributors to the standards effort who do not write a lot.

Will there be a C++1y?

Almost certainly -- and not just because the committee has slipped the deadline for C++0x.
The plans for minor revisions, C++14, are well advanced (the features have been voted into the working draft and implemented), and the plan is for a major revision in 2017, C++17.

Are there any features you don't like?

Yes.
There are also features in C++98 that I don't like, such as macros.
The issue is not whether I like something or if I find it useful for something I want to do.
The issue is whether someone has felt enough of a need to convince others to support the idea
or possibly if some usage is so ingrained in a user community that it needs support.

__cplusplus

In C++11 the macro __cplusplus will be set to a value that differs from (is greater than) the current 199711L.

auto -- deduction of a type from an initializer

Consider

auto x = 7;

Here x will have the type int because that's the type of its initializer. In general, we can write

auto x = expression;

and the type of x will be the type of the value computed from "expression".

The use of auto to deduce the type of a variable from its initializer is obviously most useful when that type
is either hard to know exactly or hard to write. Consider:

The type of tmp should be what you get from multiplying a T by a U,
but exactly what that is can be hard
for the human reader to figure out,
but of course the compiler knows once it has figured out what particular T and U
it is dealing with.

The auto feature has the distinction to be the earliest to be suggested and implemented:
I had it working in my Cfront implementation in early 1984,
but was forced to take it out because of C compatibility problems.
Those compatibility problems disappeared when C++98 and C99 accepted the removal of "implicit int";
that is, both languages require every variable and function to be defined with an explicit type.
The old meaning of auto ("this is a local variable") is now illegal.
Several committee members trawled through millions of lines of code finding only a handful of uses -- and most
of those were in test suites or appeared to be bugs.

Being primarily a facility to simplify notation in code, auto does not affect the standard library specification.

Range-for statement

A range for statement allows you to iterate through a "range",
which is anything you can iterate through like an STL-sequence defined by a begin() and end().
All standard containers can be used as a range, as can a std::string, an initializer list, an array,
and anything for which you define begin() and end(), e.g. an istream.
For example:

right-angle brackets

In C++98 this is a syntax error because there is no space between the two >s.
C++11 recognizes such two >s as a correct termination of two template argument lists.

Why was this ever a problem?
A compiler front-end is organized parses/stages.
This is about the simplest model:

lexical analysis (make up tokens from characters)

syntax analysis (check the grammar)

type checking (find the type of names and expressions)

These stages are in theory and sometimes in practice strictly separate,
so the lexical analyzer that determines that >> is a token (usually meaning right-shift or input) has no idea
of its meaning; in particular, it has no idea of templates or nested template argument lists.
However, to get that example "correct" the three stages has somehow to cooperate.
The key observation that led to the problem being resolved was that every C++ compiler already did understand the problem
so that it could give decent error messages.

Being explicit about the default is redundant.
However, comments about copy operations and (worse)
a user explicitly defining copy operations meant to give the default behavior are not uncommon.
Leaving it to the compiler to implement the default behavior is simpler, less error-prone,
and often leads to better object code.

The "default" mechanism can be used for any function that has a default.
The "delete" mechanism can be used for any function. For example, we can
eliminate an undesired conversion like this:

struct Z {
// ...
Z(long long); // can initialize with an long long
Z(long) = delete; // but not anything less
};

[N3174=100164] B. Stroustrup:
To move or not to move.
An analysis of problems related to generated copy and move operations.
Approved.

control of defaults: move and copy

By default, a class has 5 operations:

copy assignment

copy constructor

move assignment

move constructor

destructor

If you declare any of those you must consider all and explicitly define or default the ones you want.
Think of copying, moving, and destruction as closely related operations, rather than individual operations
that you can freely mix and match - you can specify arbitrary combinations, but only a few combinations make
sense semantically.

Here constexpr says that the function must be of a simple form so that it can be evaluated
at compile time if given constant expressions arguments.

In addition to be able to evaluate expressions at compile time, we want to be able to require
expressions to be evaluated at compile time;
constexpr in front of a variable definition does that (and implies const):

Please note that constexpr is not a general purpose replacement for const (or vise versa):

const's primary function is to express the idea that an object is not modified through an interface
(even though the object may very well be modified through other interfaces).
It just so happens that declaring an object const provides excellent optimization opportunities for the compiler.
In particular, if an object is declared const and its address isn't taken, a compiler is often
able to evaluate its initializer at compile time (though that's not guaranteed)
and keep that object in its tables rather than emitting it into the generated code.

constexpr's primary function is to extend the range of what can be computed at compile time,
making such computation type safe.
Objects declared constexpr have their initializer evaluated at compile time;
they are basically values kept in the compiler's tables and only emitted into
the generated code if needed.

This notion has been popular in generic programming under the label "typeof" for a long time,
but the typeof implementations in actual use were incomplete and incompatible,
so the standard version is named decltype.

If you just need the type for a variable that you are about to initialize auto is often a
simpler choice. You really need decltype if you need a type for something that is not a variable,
such as a
return type.

The distinction between direct initialization and copy initialization is maintained for {}-initialization,
but becomes relevant less frequently because of {}-initialization.
For example, std::vector has an explicit constructor from int and an initializer-list constructor:

The way C++11 avoids a lot of incompatibilities is by relying on the actual values of initializers
(such as 7 in the example above)
when it can (and not just type) when deciding what is a narrowing conversion.
If a value can be represented exactly as the target type, the conversion is not narrowing.

In-class member initializers

In C++98, only static const members of integral types can be initialized in-class,
and the initializer has to be a constant expression.
These restrictions ensure that we can do the initialization at compile-time.
For example:

The basic idea for C++11 is to allow a non-static data member to be initialized where
it is declared (in its class).
A constructor can then use the initializer when run-time initialization is needed.
Consider:

class A {
public:
int a = 7;
};

This is equivalent to:

class A {
public:
int a;
A() : a(7) {}
};

This saves a bit of typing, but the real benefits come in classes with multiple constructors.
Often, all constructors use a common initializer for a member:

The fact that hash_algorithm and s each has a single default is lost in the mess of code and could
easily become a problem during maintenance.
Instead, we can factor out the initialization of the data members:

A static_assert can be useful to make assumptions about a program and its treatment by a compiler explicit.
Note that since static_assert is evaluated at compile time, it cannot be used to check assumptions that
depends on run-time values. For example:

The keyword using is used to get a linear notation "name followed by what it refers to."
We tried with the conventional and convoluted typedef solution, but never managed to get
a complete and coherent solution until we settled on a less obscure syntax.

Specialization works
(you can alias a set of specializations but you cannot specialize an alias)
For example:

This code simply ``peels off'' the first non-format argument and then calls itself recursively.
When there are no more non-format arguments, it calls the first (simpler) printf() (above).
This is rather standard functional programming done at compile time.
Note how the overloading of << replaces the use of the (possibly erroneous) ``hint'' in the format specifier.

The Args...defines what is called a ``parameter pack.''
That's basically a sequence of (type/value) pairs from which you can ``peel off'' arguments starting with the first.
When printf() is called with one argument, the first definition (printf(const char*)) is chosen.
When printf() is called with two or more arguments, the second definition (printf(const char*, T value, Args... args)) is chosen,
with the first argument as s, the second as value, and the rest (if any) bundled into the parameter pack args
for later use.
In the call

printf(++s, args...);

The parameter pack args is expanded so that the next argument can now be selected as value.
This carries on until args is empty (so that the first printf() is called).

If you are familiar with functional programming, you should find this an unusual notation for a pretty standard technique.
If not, here are some small technical examples that might help.
First we can declare and use a simple variadic template function (just like printf() above):

Rvalue references

The distinction between lvalues (what can be used on the left-hand side of an assignment) and rvalues
(what can be used on the right-hand side of an assignment) goes back to Christopher Strachey
(the father of C++'s distant ancestor CPL and of denotational semantics).
In C++, non-const references can bind to lvalues and const references can bind to lvalues or rvalues,
but there is nothing that can bind to a non-const rvalue.
That's to protect people from changing the values of temporaries that are destroyed before
their new value can be used.
For example:

If that incr(0) were allowed either some temporary that nobody ever saw would be incremented or - far worse -
the value of 0 would become 1.
The latter sounds silly, but there was actually a bug like that in early Fortran compilers that set aside a memory
location to hold the value 0.

So far, so good, but consider

template<class T> swap(T& a, T& b) // "old style swap"
{
T tmp(a); // now we have two copies of a
a = b; // now we have two copies of b
b = tmp; // now we have two copies of tmp (aka a)
}

If T is a type for which it can be expensive to copy elements, such as string and vector, swap becomes an expensive
operation (for the standard library, we have specializations of string and vector swap() to deal with that).
Note something curious: We didn't want any copies at all. We just wanted to move the values of a, b,
and tmp around a bit.

In C++11, we can define "move constructors" and "move assignments" to move rather than copy their argument:

The idea behind a move assignment is that instead of making a copy, it simply takes the representation from its source and
replaces it with a cheap default. For example, for strings s1=s2 using the move assignment would not make a copy of
s2's characters; instead, it would just let s1 treat those characters as its own and somehow delete s1's
old characters (maybe by leaving them in s2, which presumably are just about to be destroyed).

How do we know whether it's ok to simply move from a source? We tell the compiler:

move(x) means "you can treat x as an rvalue".
Maybe it would have been better if move() had been called rval(),
but by now move() has been used for years.
The move() template function can be written in C++11 (see the "brief introduction") and uses rvalue references.

Rvalue references can also be used to provide perfect forwarding.

In the C++11 standard library, all containers are provided with move constructors and move assignment and
operations that insert new elements, such as insert() and push_back() have versions that take rvalue references.
The net result is that the standard containers and algorithms quietly - without user intervention - improve in performance
because they copy less.

Obviously, it's illegal to write one member and then read another
but people do that nevertheless (usually by mistake).

C++11 modifies the restrictions of unions to make more member types feasible; in particular,
it allows a member of types with constructors and destructors.
It also adds a restriction to make
the more flexible unions less error-prone by encouraging the building of discriminated unions.

Union member types are restricted:

No virtual functions (as ever)

No references (as ever)

No bases (as ever)

If a union has a member with a user-defined constructor, copy, or destructor then that special function is
deleted;
that is, it cannot be used for an object of the union type. This is new.

PODs (generalized)

A POD ("Plain Old Data") is something that can be manipulated like a C struct,
e.g. copies with memcpy(), initializes with memset(), etc.
In C++98 the actual definition of POD is based on a set of restrictions on the use of language
features used in the definition of a struct:

In C++11, S and SS are "standard layout types" (a.k.a. POD) because there is really nothing
"magic" about SS: the constructor does not affect the layout (so memcpy() would be fine),
only the initialization rules (memset() would be bad - not enforcing the invariant).
However, SSS will still have an embedded vptr and will not be anything like "plain old data."
C++11 defines POD, trivially copyable types, trivial types, and standard-layout types to deal
with various technical aspects of what used to be PODs.
POD is defined recursively

If all your members and bases are PODs, you're a POD

As usual (details in section 9 [10])

No virtual functions

No virtual bases

No references

No multiple access specifiers

The most important aspect of C++11 PODs are that
adding or subtracting constructors do not affect layout or performance.

Raw string literals

In many cases, such as when you are writing regular expressions for the use with the standard
regex library, the fact that a backslash (\) is an escape character is a real nuisance
(because in regular expressions backslash is used to introduce special characters representing character classes).
Consider how to write the pattern representing two words separated by a backslash (\w\\\w):

string s = "\\w\\\\\\w"; // I hope I got that right

Note that the backslash character is represented as two backslashes in a regular expression.
Basically, a "raw string literal" is a string literal where a backslash is just a backslash so that our example
becomes:

string s = R"(\w\\\w)"; // I'm pretty sure I got that right

The original proposal for raw strings presents this as a motivating example

"('(?:[^\\\\']|\\\\.)*'|\"(?:[^\\\\\"]|\\\\.)*\")|" // Are the five backslashes correct or not?
// Even experts become easily confused.

The R"(...)" notation is a bit more verbose than the "plain" "..." but "something more" is necessary when you
don't have an escape character: How do you put a quote in a raw string? Easy, unless it is preceded by a ):

R"("quoted string")" // the string is "quoted string"

So, how do we get the character sequence )" into a raw string? Fortunately, that's a rare problem,
but "(...)" is only the default delimiter pair.
We can add delimiters before and after the (...) in "(...)". For example

User-defined literals

However, in C++98 there are no literals for user-defined types.
This can be a bother and also seen as a violation of the principle that user-defined types
should be supported as well as built-in types are.
In particular, people have requested:

The basic (implementation) idea is that after parsing what could be a literal, the compiler always check for a suffix.
The user-defined literal mechanism simply allows the user to specify a new suffix and what is to be done with the
literal before it. It is not possible to redefine the meaning of a built-in literal suffix or augment the syntax of literals.
A literal operator can request to get its (preceding) literal passed ``cooked'' (with the value it would have had if the
new suffix hadn't been defined) or ``uncooked'' (as a string).

To get an ``uncooked'' string, simply request a single const char* argument:

Attributes

``Attributes'' is a new standard syntax aimed at providing some order in the mess of facilities for
adding optional and/or vendor specific information into source code
(e.g. __attribute__, __declspec, and #pragma).
C++11 attributes differ from existing syntaxes by being applicable essentially everywhere in code
and always relating to the immediately preceding syntactic entity.
For example:

As you can see, an attribute is placed within double square brackets: [[ ... ]].
noreturn and carries_dependency are the two attributes defined in the standard.

There is a reasonable fear that attributes will be used to create language dialects.
The recommendation is to use attributes to only control things that do not affect the
meaning of a program but might help detect errors (e.g. [[noreturn]]) or help
optimizers (e.g. [[carries_dependency]]).

One planned use for attributes is improved support for OpenMP. For example:

The argument [](int a, int b) { return abs(a)<abs(b); } is a "lambda" (or "lambda function" or "lambda expression"),
which specifies an operation that given two integer arguments a and b returns the result of comparing their
absolute values.

A lambda expression can access local variables in the scope in which it is used. For example:

Some consider this "really neat!"; others see it as a way to write dangerously obscure code.
IMO, both are right.

The [&] is a "capture list" specifying that local names used will be passed by reference.
We could have said that we wanted to "capture" only v, we could have said so: [&v].
Had we wanted to pass v by value, we could have said so: [=v].
Capture nothing is [], capture all by references is [&], and capture all by value is [=].

If an action is neither common nor simple, I recommend using a named function object or function.
For example, the example above could have been written:

For a tiny function, such as this Record name field comparison, the function object notation is verbose, though the generated code
is likely to be identical. In C++98, such function objects had to be non-local to be used as template argument; in C++11
this is no longer necessary.

To specify a lambda you must provide

its capture list: the list of variables it can use (in addition to its arguments),
if any ([&] meaning "all local variables passed by reference" in the Record comparison example).
If no names needs to be captured, a lambda starts with plain [].

(optionally) its arguments and their types (e.g, (int a, int b))

The action to be performed as a block (e.g., { return v[a].name<v[b].name; }).

(optionally) the return type using the
new suffix return type syntax; but typically we just deduce the return type from the return statement.
If no value is returned void is deduced.

If a function declared noexcept throws (so that the exception tries to escape,
the noexcept function) the program is terminated (by a call to terminate()).
The call of terminate() cannot rely on objects being in well-defined states (i.e. there is no
guarantees that destructors have been invoked, no guaranteed stack unwinding, and no possibility for
resuming the program as if no problem had been encountered). This is deliberate and makes noexcept
a simple, crude, and very efficient mechanism (much more efficient than the old dynamic throw()
mechanism).

It is possibly to make a function conditionally noexcept.
For example, an algorithm can be specified to be noexcept
if (and only if) the operations it uses on a template argument are noexcept:

Here, I first use noexcept as an operator: noexcept(f(v.at(0))) is true if f(v.at(0))
can't throw, that is if the f() and at() used are noexcept.

The noexcept() operator is a constant expression and does not evaluate its operand.

The general form of a noexcept declaration is noexcept(expression) and ``plain noexcept''
is simply a shorthand for noexcept(true). All declarations of a function must have compatible
noexcept specifications.

A destructor shouldn't throw;
a generated destructor is implicitly noexcept (independently of what code is in its body)
if all of the members of its class have noexcept destructors.

It is typically a bad idea to have a move operation throw, so declare those noexcept wherever possible.
A generated copy or move operation is implicitly noexcept if all of the copy or move operations it uses
on members of its class have noexcept destructors.

noexcept is widely and systematically used in the standard library to improve performance
and clarify requirements.
See also:

A declaration marked override is only valid if there is a function to override.
The problem with h() is not guaranteed to be caught
(because it is not an error according to the language definition)
but it is easily diagnosed.

override is only a contextual keyword, so you can still use it as an identifier:

There are legitimate reasons for wanting to prevent overriding, but I'm afraid that most examples I have
been shown to demonstrate the need for final have been based on mistaken assumptions on how
expensive virtual functions are (usually based on experience with other languages).
So, if you feel the urge to add a final specifier, please double check that the reason is logical:
Would semantic errors be likely if someone defined a class that overwrote that virtual function?
Adding final closes the possibility of a future user of the class might provide a better implementation
of the function for some class you haven't thought of.
If you don't want to keep that option open,
why did you define the function to be virtual in the first place?
Most reasonable answers to that question that I have encountered have been along the lines:
This is a fundamental function in a framework that the framework builders needed to override but isn't
safe for general users to override.
My bias is to be suspicious towards such claims.

If it is performance (inlining) you want or you simply never want to override,
it is typically better not to define a function to be virtual in the first place.
This is not Java.

final is only a contextual keyword, so you can still use it as an identifier:

int final = 7; // not recommended

See also:

Standard: 10 Derived classes [class.derived] [9]

Standard: 10.3 Virtual functions [class.virtual]

C99 features

To preserve a high degree of compatibility,
a few minor changes to the language were introduced in collaboration with the C standards committee:

thread-local storage (thread_local)

Unicode characters

Sorry, I have not had time to write this entry. Please come back later.

?

Copying and rethrowing exceptions

How do you catch an exception and then rethrow it on another thread?
Use a bit of library magic as described in the standard 18.8.5 Exception Propagation:

exception_ptr current_exception();Returns: An exception_ptr object that refers to the currently handled exception (15.3) or a copy of the currently handled exception,
or a null exception_ptr object if no exception is being handled. The referenced object shall remain valid at least as long as there is
an exception_ptr object that refers to it. ...

We here have a namespace Mine with both the latest release (V99) and the previous one (V98).
If you want to be specific, you can:

#include "Mine.h"
using namespace Mine;
// ...
V98::f(1); // old version
V99::f(1); // new version
f(1); // default version

The point is that the inline specifier makes the declarations from the nested namespace appear
exactly as if they had been declared in the enclosing namespace.

This is a very ``static'' and implementer-oriented facility in that the inline specifier has
to be placed by the designer of the namespaces -- thus making the choice for all users.
It is not possible for a user of Mine to say ``I want the default to be V98 rather than V99.''

See

Standard 7.3.1 Namespace definition [7]-[9].

Explicit conversion operators

C++98 provides implicit and explicit constructors; that is, the conversion defined by a constructor declared explicit
can be used only for explicit conversions whereas other constructors can be used for implicit conversions also.
For example:

Unfortunately, there is no explicit conversion operators (because there are far fewer problematic examples).
C++11 deals with that oversight by allowing conversion operators to be explicit. For example:

Algorithms improvements

The standard library algorithms are improved partly by simple addition of new algorithms,
partly by improved implementations made possible by new language features, and
partly by new language features enabling easier use:

Effects of move:
Moving can be much more efficient than copying (see Move semantics).
For example, move-based std::sort() and std::set::insert() has been measured to be 15 times faster than copy based versions.
This is less impressive than it sounds because such standard library operations for standard library types,
such as string and vector,
are usually hand-optimized to gain the
effects of moving through techniques such as replacing copies with optimized swaps.
However, if your type has a move operation, you gain the performance benefits automatically from the standard algorithms.

Consider also that the use of moves allows simple and efficient sort (and other algorithms)
of containers of ``smart'' pointers,
especially
unique_ptr:

Use of lambdas:
For ages, people have complained about having to write functions or (better) function objects for use as operations,
such as Cmp<T> above,
for standard library (and other) algorithms.
This was especially painful to do if you wrote large functions (don't) because in C++98 you could not define a
local function object to use as an argument; now you can.
However, lambdas allows us to define operations ``inline:''

Move operators:
Containers now have move constructors and move assignments (in addition to the traditional copy operations).
The most important implication of this is that we can efficiently return a container from a function:

The point here is that no vectors are copied.
Rewrite this to return a free-store-allocated vector and you have to deal with memory management.
Rewrite this to pass the vector to be filled as an argument to make_random() and you
have a far less obvious code (plus an added opportunity for making an error).

This will construct a pair<string,int> out of s and i and move it into vp.
Note ``move'' not ``copy;''
There is a push_back version that takes an
rvalue reference
argument so that we can take advantage of
string's move constructor.
Note also the use of the
unified initializer syntax to avoid verbosity.

Emplace operations:
The push_back() using a move constructor is far more efficient in important cases than the traditional
copy-based one, but in extreme cases we can go further.
Why copy/move anything? Why not make space in the vector and then construct the desired value in that space?
Operations that do that are called ``emplace'' (meaning ``putting in place'').
For example emplace_back():

An emplace takes a
variadic template
argument and uses that to construct an object of the desired type.
Whether the emplace_back() really is more efficient than the push_back() depends on the types involved
and the implementation (of the library and of variadic templates).
If you think it matters, measure.
Otherwise, choose based on aesthetics: vp.push_back({s,i}); or vp.emplace_back(s,i);.
For now, I prefer the push_back() version, but that might change over time.

Scoped allocators:
Containers can now hold "real allocation objects (with state)" and use those to control
nested/scoped allocation (e.g. allocation of elements in a container)

Obviously, the containers are not the only parts of the standard library that has benefitted from the new
language features. Consider:

Compile-time evaluation:
constexpr
is used to ensure compiler time evaluation in
,
bitset,
duration,
char_traits,
array,
atomic types,
random numbers,
complex<double>., etc.
In some cases, it means improved performance;
in others (where there is no alternative to compile-time evaluation),
it means absence of messy low-level code and macros.

Tuples:
Tuples would not be possible without variadic templates.

Scoped allocators

For compactness of container objects and for simplicity, C++98 did not require containers to support allocators with state:
Allocator objects need not be stored in container objects.
This is still the default in C++11, but it is possible to use an allocator with state, say an allocator that holds a
pointer to an arena from which to allocate.
For example:

It is not guaranteed that the default allocator and Simple_alloc takes up no space
in a vector object, but a bit of elegant template metaprogramming in the library implementation
can ensure that.
So, using an allocator type imposes a space overhead only if its objects actually has state (like My_alloc).

A rather sneaky problem can occur when using containers and user-defined allocators:
Should an element be in the same allocation area as its container?
For example, if you use Your_allocator for Your_string to allocate its elements
and I use My_allocator to allocate elements of My_vector
then which allocator should be used for string elements in My_vector<Your_allocator>?
The solution is the ability to tell a container which allocator to pass to elements.
For example, assuming that I have an allocator My_alloc
and I want a vector<string>
that uses My_alloc for both the vector element
and string element allocations.
First, I must make a version of string that accepts
My_alloc objects:

Now svec is a vector of strings using My_alloc to allocate memory for strings.
What's new is that the standard library ``adaptor'' (''wrapper type'') scoped_allocator_adaptor is used
to indicate that string also should use My_alloc.
Note that the adaptor can (trivially) convert My_alloc<xstring> to the My_alloc<char> that xstring needs.

Obviously, the first variant, svec0, will be by far the most common, but for systems with serious memory-related
performance constraints, the other versions (especially svec2) can be important.
A few typedefs would make that code a bit more readable, but it is good it is not something you have to
write every day.
The scoped_allocator_adaptor2 is a variant of scoped_allocator_adaptor for the case where
the two non-default allocators differ.

std::array

The standard container array is a fixed-sized random-access sequence of elements defined in <array>.
It has no space overheads beyond what it needs to hold its elements,
it does not use free store,
it can be initialized with an initializer list,
it knows its size (number of elements),
and doesn't convert to a pointer unless you explicitly ask it to.
In other words, it is very much like a built-in array without the problems.

The standard array's features makes it attractive for embedded systems programming
(and similar constrained, performance-critical, or safety critical tasks).
It is a sequence container so it provides the usual member types and functions (just like vector):

std::forward_list

The standard container forward_list, defined in <forward_list>, is basically a singly-linked list.
It supports forward iteration (only) and guarantees that elements don't move if you insert or erase one.
It occupies minimal space (an empty list is likely to be one word) and does not provide a size() operation
(so that it does not have to store a size member):

Unordered containers

A unordered container is a kind of hash table. C++11 offers four standard ones:

unordered_map

unordered_set

unordered_multimap

unordered_multiset

They should have been called hash_map etc., but there are so many incompatible uses of those names that
the committee had to choose new names and the unordered_map, etc. were the least bad we could find.
The "unordered" refers to one of the key differences between map and unordered_map:
When you iterate over a map
you do so in the order provided by its less-than comparison operator (by default <) whereas the value type
of unordered_map is not required to have a less-than comparison operator and a hash table doesn't naturally
provide an order.
Conversely, the element type of a map is not required to have a hash function.

The basic idea is simply to use unordered_map as an optimized version of map where
optimization is possible and reasonable. For example:

The iterator over m will present the elements in alphabetical order; the iteration over um
will not (except through a freak accident).
Lookup is implemented very differently for m and um.
For m lookup involves log2(m.size()) less-than comparisons whereas for um
lookup involves a single call of a hash function and one or more equality operations.
For a few elements (say a few dozen), it is hard to tell which is faster.
For larger numbers of elements (e.g. thousands), lookup in an unordered_map
can be much faster than for a map.

More to come.

See also:

Standard: 23.5 Unordered associative containers.

std::tuple

The standard library tuple (an N-tuple) is a ordered sequence of N values where
N can be a constant from 0 to a large implementation-defined value, defined in <tuple>.
You can think of an tuple as an unnamed struct with members of the specified tuple element types.
In particular, the elements of a tuple is stored compactly; a tuple is not a linked structure.

The element types of a tuple can explicitly specified or be deduced (using make_tuple())
and the elements can be access by (zero-based) index using get():

Tuples are used (directly of indirectly) whenever we want a heterogeneous list of elements at compile time
but do not want to define a named class to hold them.
For example, tuple is used internally in std::function and std::bind to
hold arguments.

The most frequently useful tuple is the 2-tuple; that is, a pair.
However, pair is directly supported in the standard library through std::pair (20.3.3 Pairs).
A pair can be used to initialize a tuple, but the opposite isn't the case.

The comparison operators (==, !=, , and >=) are defined for tuples of comparable element types.

See also:

Standard: 20.5.2 Class template tuple

Variadic template paper

Boost::tuple

metaprogramming and type traits

Sorry. Come back later.

std::function and std::bind

The bind and function standard function objects are defined in <functional>
(together with a lot of other function objects);
they are used to handle functions and function arguments.
bind is used to take a function (or a function object or anything you can invoke using the (...) syntax)
and produce a function object with one or more of the arguments of the argument function ``bound'' or rearranged.
For example:

This binding of arguments is usually called ``Currying.''
The _1 is a place-holder object indicating where the first argument of ff is to go when f is
called through ff.
The first argument is called _1, the second _2, and so on. For example:

This second version was necessary and is widely used because the first (and for a user simplest)
version cannot be implemented in C++98.

function is a type that can hold a value of just about anything you can invoke using the (...) syntax.
In particular, the result of bind can be assigned to a function.
function is very simple to use. For example:

functions are useful for callbacks, for passing operations as argument, etc.
It can be seen as a replacement for the C++98 standard library function objects
mem_fun_t, pointer_to_unary_function, etc.
Similarly, bind() can be seen as a replacement for bind1() and bind2().

Now, if an exception is thrown, the unique_ptr will (implicitly) destroy the object pointed to.
That's basic
RAII.
However, unless we really need to return a built-in pointer,
we can do even better by returning a unique_ptr:

The unique_ptr has "move semantics" so the initialization of q with the rvalue that is the result of the call
f() simply transfers ownership into q.

One of the uses of unique_ptr is as a pointer in a container, where we might have used a built-in pointer
except for exception safety problems (and to guarantee destruction of the pointed to elements):

unique_ptr is represented by a simple built-in pointer and the overhead of using one compared to a built-in pointer
are miniscule.
In particular, unique_ptr does not offer any form of dynamic checking.

shared_ptr

A shared_ptr is used to represent shared ownership; that is, when two pieces of code needs access
to some data but neither has exclusive ownership (in the sense of being responsible for destroying the object).
A shared_ptr is a kind of counted pointer where the object pointed to is deleted when the use count goes to zero.
Here is a highly artificial example:

A more realistic example would be pointers to nodes in a general graph where someone wanting to remove a pointer
to a node wouldn't know if anyone else held a pointer to that node. If a node can hold resources that
require an action by a destructor (e.g. a file handle so that a file needs to be closed when the node
is deleted).
You could consider shared_ptr to be for what you might consider plugging in a
garbage collector for, except that maybe you don't have enough garbage for that
to be economical, your execution environment doesn't allow that, or the resource managed is not just
memory (e.g. that file handle).
For example:

Here Node's destructor (the implicitly generated destructor will do fine) deletes its sub-nodes;
that is, left and right's destructors are invoked.
Since left is a shared_ptr,
the Node pointed to (if any) is deleted if left was the last pointer to it; right
is handled similarly and f's destructor does whatever is required for f.

Note that you should not use a shared_ptr just to pass a pointer from one owner to another; that's
what unique_ptr is for and unique_ptr does that cheaper and better.
If you have been using counted pointers as return values from factory functions and the like, consider
upgrading to unique_ptr rather than shared_ptr.

Please don't thoughtlessly replace pointers with shared_ptrs in an attempt to prevent memory leaks;
shared_ptrs are not a panacea nor are they without costs:

a circular linked structure of shared_ptrs
will cause a memory leak (you'll need some logical complication to break
the circle, e.g. using a weak_ptr),

shared pointers in a multi-threaded environment can be expensive
(because of the need to avoid data races on the use count),

a destructor for a shared object does not execute at a predictable time, and

the algorithms/logic for the update of any shared object is easier to get wrong than for an object
that's not shared.

.
A shared_ptr represents
shared ownership but shared ownership isn't my ideal: It is better if an object has a definite
owner and a definite, predictable lifespan.

See also

the C++ draft: Shared_ptr (20.7.13.3)

weak_ptr

Weak pointers are often explained as what you need to break loops in data structures managed using
shared_ptrs.
I think it is better to think of a weak_ptr as a pointer to something that

you need access to (only) if it exists, and

may get deleted (by someone else), and

must have its destructor called after its last use (usually to delete anon-memory resource)

Consider an implementation of the old "asteroid game".
All asteroids are owned by "the game" but each asteroids must keep track of neighboring asteroids and
handle collisions. A collision typically leads to the destruction of one or more asteroids.
Each asteroid must keep a list of other asteroids in its neighborhood.
Note that being on such a neighbor list should not keep an astroid "alive" (so a shared_ptr
would be inappropriate).
On the other hand, an asteroid must not be destroyed while another asteroid is looking at it
(e.g. to calculate the effect of a collision).
And obviously, an asteroids destructor must be called to release resources (such as a connection to
the graphics system).
What we need is a list of asteroids that might still be intact and a way of "getting hold of one if it exist"
for a while. A weak_ptr does just that:

Obviously, I radically simplified "the owner" and gave each new Asteroid just one neighbor.
The key is that we give the Asteroid a weak_ptr to that neighbor.
The owner keeps a shared_ptr to represent the ownership that's shared whenever an Asteroid
is looking (but not otherwise).
The collision calculation for an Asteroid will look something like this:

Note that even if the owner decides to shut down the game and deletes all Asteroids
(by destroying the shared_ptrs representing ownership)
every Asteroid that is in the middle of calculating a collision still finishes correctly
(because after the p.lock() it holds
a shared_ptr that won't just become invalid).

I expect to find weak_ptr use much rarer than "plain" shared_ptr use
and I hope that unique_ptr will become much more popular than shared_ptr use
because unique_ptr represents a simpler (and more efficient) notion of ownership and (therefore) allows better local reasoning.

See also

the C++ draft: Weak_ptr (20.7.13.3)

Garbage collection ABI

Garbage collection (automatic recycling of unreferenced regions of memory) is optional in C++;
that is, a garbage collector is not a compulsory part of an implementation.
However, C++11 provides a definition of what a GC can do if one is used and an ABI (Application Binary Interface)
to help control its actions.

The rules for pointers and lifetimes are expressed in terms of "safely derived pointer" (3.7.4.3);
roughly: "pointer to something allocated by new or to a sub-object thereof."
Here are some examples of "not safely derived pointers" aka "disguised pointers"
aka what not to do in a program you want to be considered well behaved and
comprehensible to ordinary mortals:

Make a pointer point "elsewhere" for a while

int* p = new int;
p+=10;
// ... collector may run here ...
p-=10;
*p = 10; // can we be sure that the int is still there?

3.7.4.3[4]: If a pointer value that is not a safely-derived pointer value is dereferenced or deallocated,
and the referenced complete object is of dynamic storage duration and has not previously been
declared reachable (20.7.13.7), the behavior is undefined.

relaxed: safely-derived and not safely-derived pointers are treated equivalently;
like C and C++98, but that was not my intent - I wanted to allow GC if a user didn't keep a valid pointer
around for an object.

preferred: like relaxed;
but a garbage collector may be running as a leak detector and/or detector of dereferences of "bad pointers"

strict: safely-derived and not safely-derived pointers may be treated differently,
i.e. a garbage collector may be running and will ignore pointers that's not safely derived

There is no standard way of saying which alternative you prefer.
Considered that a "quality of implementation" and a "programming environment" issue.

Memory model

A memory model is an agreement between the machine architects and the compiler writers to ensure that
most programmers do not have to think about the details of modern computer hardware.
Without a memory model, few things related to threading, locking, and lock-free programming would make sense.

The key guarantee is: Two threads of execution can update and access separate memory locations
without interfering with each other.
But what is a ``memory location?''
A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having
non-zero width.
For example, here S has exactly four separate memory locations:

Why is this important? Why isn't it obvious? Wasn't this always true?
The problem is that when several computations can genuinely run in parallel, that is several
(apparently) unrelated instructions can execute at the same time, the quirks of the memory hardware can get exposed.
In fact, in the absence of compiler support, issues of instruction and data pipelining and
details of cache use will be exposed in ways that are completely unmanageable to
the applications programmer.
This is true even if no two threads have been defined to share data!
Consider, two separately compiled ``threads:''

For greater realism, I could have used the separate compilation
(within each thread) to ensure that the compiler/optimizer wouldn't be able to eliminate memory
accesses and simply ignore c and b and directly initialize x and y with 1.
What are the possible values of x and y?
According to C++11 the only correct answer is the obvious one: 1 and 1.
The reason that's interesting is that if you take a conventional good pre-concurrency C or C++ compiler, the possible
answers are 0 and 0 (unlikely), 1 and 0, 0 and 1, and 1 and 1. This has been observed ``in the wild.''
How?
A linker might allocate c and b right next to each other (in the same word) -- nothing in the C or C++ 1990s standards
says otherwise.
In that, C++ resembles all languages not designed with real concurrent hardware in mind.
However, most modern processors cannot read or write a single character, it must read or write a whole word,
so the assignment to c really is ``read the word containing c, replace the c part, and write the word back again.''
Since the assignment to b is similar, there are plenty of opportunities for the two threads to clobber each other
even though the threads do not (according to their source text) share data!

So, C++11 guarantees that no such problems occur for ``separate memory locations.''
More precisely:
A memory location cannot be safely accessed by two threads without some form of locking
unless they are both read accesses.
Note that different bitfields within a single word are not separate memory locations,
so don't share structs with bitfields among threads without some form of locking.
Apart from that caveat, the C++ memory model is simply ``as everyone would expect.''

However, it is not always easy to think straight about low-level concurrency issues.
Consider:

Is there a problem here? More precisely, is there a data race? (No there isn't).

Fortunately, we have already adapted to modern times and every current C++ compiler (that I know of)
gives the one right answer and have done so for years.
They do so for most (but unfortunately not yet for all) tricky questions.
After all, C++ has been used for serious systems programming of concurrent systems ``forever.''
The standard should further improve things.

Threads

A thread is a representation of an execution/computation in a program.
In C++11, as in much modern computing, a thread can -- and usually does -- share an address space with
other threads.
In this, it differs from a process, which generally does not directly share data with other processes.
C++ have had a host of threads implementations for a variety of hardware and operating systems in the past,
what's new is a standard-library threads library, a standard thread ABI.

Many thick books and tens of thousands of papers have been writing about concurrency, parallelism, and threading,
this FAQ entry barely scratch the surface.
It is hard to think clearly about concurrency.
If you want to do concurrent programming, at least read a book.
Do not rely just on a manual, a standard, or an FAQ.

A thread is launched by constructing a std::thread with a function or a function object (incl. a
lambda):

Unfortunately, this is unlikely to give any useful results -- whatever f() and F() might do.
The snag is that the program may terminate before or after t1 executes f() and before or after t2 executes F().
We need to wait for the two tasks to complete:

Basically, the standard library
bind makes a function object of its arguments.

In general, we'd also like to get a result back from an executed task.
With plain tasks, there is no notion of a return value; I recommend
std::future for that.
Alternative, we can pass an argument to a task telling it where to put its result:
For example:

But what about errors? What if a task throws an exception?
If a task throws an exception and doesn't catch it itself std::terminate() is called.
That typically means that the program finishes.
We usually try rather hard to avoid that.
A std::future can transmit an exception to the parent/calling thread;
that's one reason I like futures.
Otherwise, return some sort of error code.

When a thread goes out of scope the program is terminate()d unless its task has completed.
That's obviously to be avoided.

There is no way to request a thread to terminate (i.e. request that it exit as a soon as possible and as gracefully as possible) or to
force a thread to terminate (i.e. kill it).
We are left with the options of

designing our own cooperative ``interruption mechanism'' (with a piece of shared data that a caller thread can set for
a called thread to check (and quickly and gracefully exit when it is set)),

``going native'' (using thread::native_handle() to gain access to the operating system's notion of a thread),

kill the process (std::quick_exit()),

kill the program (std::terminate()).

This was all the committee could agree upon.
In particular, representatives from POSIX were vehemently against any form of ``thread cancellation''
however much C++'s model of resources rely on destructors.
There is no perfect solution for every systems and every possible application.

The basic problem with threads is data races;
that is, two threads running in a single address space can independently access an object
in ways that cause undefined results.
If one (or both) writes to the object and the other (or both) reads the object they have a
``race'' for who gets its operation(s) done first.
The results are not just undefined; they are usually completely unpredictable.
Consequently, C++11 provides some rules/guarantees for the programmer to avoid data races:

A C++ standard library function shall not directly or indirectly access objects accessible by threads
other than the current thread unless the objects are accessed directly or indirectly via the function's arguments,
including this.

A C++ standard library function shall not directly or indirectly modify objects accessible by threads
other than the current thread unless the objects are accessed directly or indirectly via the function's nonconst
arguments, including this.

C++ standard library implementations are required to avoid data races when different elements in the same sequence are modified concurrently.

Concurrent access to a stream object, stream buffer object, or C Library stream
by multiple threads may result in a data race unless otherwise specified.
So don't share an output stream between two threads unless you somehow control the access to it.

Only one thread at a time can be in the region of code between the lock() and the unlock() (often called a critical region).
If a second thread tries m.lock() while a first thread is executing in that region, that second thread
is blocked until the first executes the m.unlock().
This is simple.
What is not simple is to use mutexes in a way that doesn't cause serious problems:
What if a thread ``forgets'' to unlock()?
What if a thread tries to lock() the same mutex twice?
What if a thread waits a very long time before doing an unlock()?
What if a thread need to lock() two mutexes to do its job?
The complete answers fill books.
Here (and in the Locks section) are just the raw basics.

In addition to lock(), a mutex has a try_lock() operation which can be used to try to get into
the critical region without the risk of getting blocked:

The midnight is a feeble joke: for a mechanism as low level as mutexes, the timescale is more
likely to be milliseconds than hours.

There is of course also a recursive_timed_mutex.

A mutex is considered a resource (as it is typically used to represent a real resource)
and must be visible to at least two threads to be useful.
Consequently, it cannot be copied or moved (you couldn't just make another copy of a hardware input register).

It can be surprisingly difficult to get the lock()s and unlock()s to match.
Think of complicated control structures, errors, and exceptions.
If you have a choice, use locks to manage your mutexes;
that will save you and your users a lot of sleep.

Locks

A lock is an object that can hold a reference to a mutex and may unlock() the mutex
during the lock's destruction
(such as when leaving block scope).
A thread may use a lock to aid in managing mutex ownership
in an exception safe manner.
In other words, a lock implements
Resource Acquisition Is Initialization
for mutual exclusion.
For example:

Similarly, unique_lock supports try_lock_for() and try_lock_until().
What you get from using a lock rather than the mutex directly is exception handling and protection
against forgetting to unlock().
In concurrent programming, we need all the help we can get.

What if we need two resources represented by two mutexes?
The naive way is to acquire the mutexes in order:

This has the potentially deadly flaw that some other thread could try to acquire m1 and m2 in the
opposite order so that each had one of the locks needed to proceed and would wait forever for the
second (that's called deadlock).
With many locks in a system, that's a real danger.
Consequently, the standard locks provide two functions for (safely) trying to acquire two or more locks:

Obviously, the implementation of lock() has to be carefully crafted to avoid deadlock.
In essence, it will do the equivalent to careful use of try_lock()s.
If lock() fails to acquire all locks it will throw an exception.
Actually, lock() can take any argument with lock(), try_lock(), and unlock()
member functions (e.g. a mutex), so we
can't be specific about which exception lock() might throw; that depends on its arguments.

If you prefer to use try_lock()s yourself, there is an equivalent to lock() to help:

Condition variables

Condition variables provide synchronization primitives used to block a thread until notified by some other
thread that some condition is met or until a system time is reached.

Sorry, I have not had time to write this entry. Please come back later.

See also

Standard: 30.5 Condition variables [thread.condition]

???

Time utilities

We often want to time things or to do things dependent on timing.
For example, the standard-library
mutexes
and
locks provide the option for a
thread to wait for a period of time (a duration)
or to wait until a given point in time (a time_point).

If you want to know the current time_point you can call now() for one of three clocks:
system_clock, monotonic_clock, high_resolution_clock. For example:

The time facilities here are intended to efficiently support uses deep in the system;
they do not provide convenience facilities to help you maintain your social calendar.
In fact, the time facilities originated with the stringent needs for high-energy physics.
To be able to express all time scales (such as centuries and picoseconds), avoid confusion about units, typos, and rounding errors,
durations and time_points are
expressed using a compile-time rational number package.
A duration has two parts:
a numbers clock ``tick'' and something (a ``period'') that says what a tick means (is it a second or a millisecond?);
the period is part of a durations type.
This table from the standard header <ratio>,
defining the periods of the SI system (also known as MKS or metric system)
might give you an idea of the scope of use:

The compile time rational numbers provide the usual arithmetic
(+, -, *, and /) and comparison (==, !=, , >=) operators for whatever combinations
durations and time_points makes sense (e.g. you can't add two time_points).
These operations are also checked for overflow and divide by zero.
Since this is a compile-time facility, don't worry about run-time performance.
In addition you can use ++, --, +=, -=, *=, and /= on durations and tp+=d and tp-=d for a time_point tp and a duration d.

Here are some examples of values using standard duration types as defined in <chrono>:

You cannot initialize a duration to a fraction.
For example, don't try 2.5 seconds; instead use 2500 milliseconds.
This is because a because a duration is interpreted as a number of ``ticks.''
Each tick represent on unit of the duration's ``period,'' such as milli and kilo as defined above.
The default unit is seconds; that is, for a duration with a period of 1 a tick is interpreted as a second.
We can be explicit about the representation of a duration:

Atomics

Sorry, I have not had time to write this entry. Please come back later.

See also

Standard: 29 Atomic operations library [atomics]

???

std::future and std::promise

Concurrent programming can be hard,
especially if you try to be clever with threads,
and locks.
It is harder still if you must use condition variables
or use std-atomics (for lock-free programming).
C++11 offers future and promise for returning a value from a task spawned on a separate thread
and packaged_task to help launch tasks.
The important point about future and promise is that they enable a transfer of a value between two tasks
without explicit use of a lock; ``the system'' implements the transfer efficiently.
The basic idea is simple: When a task wants to return a value to the thread that launched it,
it puts the value into a promise.
Somehow, the implementation makes that value appear in the future attached to the promise.
The caller (typically the launcher of the task) can then read the value.
For added simplicity, see async().

The standard provides three kinds of futures, future for most simple uses, and shared_future and atomic_future for some trickier cases.
Here, I'll just present future because it's the simplest and does all I need done.
If we have a future<X> called f, we can get() a value of type X from it:

X v = f.get(); // if necessary wait for the value to get computed

If the value isn't there yet, our thread is blocked until it arrives.
If the value couldn't be computed, the result of get() might be to throw an exception
(from the system or transmitted from the task from which we were trying to get() the value.

We might not want to wait for a result, so we can ask the future if a result has arrived:

if (f.wait_for(0)) { // there is a value to get()
// do something
}
else {
// do something else
}

However, the main purpose of future is to provide that simple get().

The main purpose of promise is to provide a simple ``put'' (curiously, called ``set'') to match future's get().
The names ``future'' and ``promise'' are historical; please don't blame me.
They are also a fertile source of puns.

If you have a promise and need to send a result of type X (back) to a future,
there are basically two things you can do: pass a value and pass an exception:

So far so good, but how do I get a matching future/promise pair,
one in my thread and one in some other thread?
Well, since futures and promises can be moved (not copied) around there is a wide variety of possibilities.
The most obvious idea is for whoever wants a task done to create a thread and give the promise to it
while keeping the corresponding future as the place for the result.
Using async() is the most extreme/elegant variant of the latter technique.

The packaged_task type is provided to simplify launching a thread to execute a task.
In particular, it takes care of setting up a future connected to a promise
and to provides the wrapper code to put the return value or exception from the task into the promise.
For example:

std::async()

The async() simple task launcher function is the only facility in this FAQ that has not yet been voted
into the draft standard.
I expect it to be voted in in October after reconciling two slighty different proposals
(feel free to tell your local committee member to be sure to vote for it).

Here is an example of a way for the programmer to rise above the messy threads-plus-lock level of concurrent programming:

This is a very simple-minded use of concurrency (note the ``magic number''),
but note the absence of explicit threads, locks, buffers, etc.
The type of the f-variables are determined by the return type of the standard-library function
async() which is a
future.
If necessary, get() on a future waits for a
thread to finish.
Here, it is async()'s job to spawn threads as needed and the future's job to join() the threads appropriately.
``Simple'' is the most important aspect of the async()/future design;
futures can also be used with threads in general,
but don't even think of using async() to launch tasks that do I/O, manipulates mutexes, or in other ways interact with other tasks.
The idea behind async() is the same as the idea behind the range-for statement:
Provide a simple way to handle the simplest, rather common, case and leave the more complex examples to the fully general mechanism.

An async() can be requested to launch in a new thread,
in any thread but the caller's,
or to launch in a different thread only if async() ``thinks'' that it is a good idea.
The latter is the simplest from the user's perspective and potentially the most efficient (for simple tasks(only)).

abandoning a process

Random number generation

Random numbers are useful in many contexts, such as testing, games, simulation, and security.
The diversity of application areas is reflected in the wide selection of random number generators provided
by the standard library.
A random number generator consists of two parts an
engine
that produces a sequence of random or pseudo-random values and a
distribution
that maps those values in to a mathematical distribution in a range.
Examples of distributions are
uniform_int_distribution (where all integers produced are equally likely) and
normal_distribution (``the bell curve''); each for some specified range.
For example:

Thanks to its uncompromising attention to generality and performance one expert deemed the
standard-library random number component ``what every random number library wants to be when it grows up.''
However, it can hardly be deemed ``novice friendly.''
I have never found the random number interface to be a performance bottle neck, but I have never taught
novices (of any background) without needing a very simple random number generator.
This would be sufficient

int rand_int(int low, int high); // generate a random number from a uniform distribution in [low:high]

So, how could we get that?
We have to get something like
dice()
inside
rand_int():

Regular expressions

Sorry, I have not had time to write this entry. Please come back later.

See also

Standard: ???

???

Concepts

Warning: "concepts" did not make it into C++11 and a radical redesign is in progress

"Concepts" is a mechanism for describing requirements on types, combinations of types, and combinations of types and integers.
It is particularly useful for getting early checking of uses of templates.
Conversely, it also helps early detection of errors in a template body.
Consider the standard library algorithm fill:

Note that we only declared fill(); we did not define it (provide its implementation).
On the other hand, we explicitly stated what fill() requires from its argument:

The arguments first and last must be of a type that is a ForwardIterator
(and they must be of the same type).

The third argument v must be of a type that can be assigned to
the ForwardIterator's value_type.

We knew that, of course, having read the standard.
However, compilers do not read requirement documents, so we had to tell it in code
using the concepts ForwardIterator and Assignable.
The result is that errors in the use of fill() are caught immediately at the point of use
and that error messages are greatly improved.
The compiler now has the information about the programmers' intents to allow good checking and good diagnostics.

Concept maps

An int* is a ForwardIterator;
we said so when presenting concepts,
the standard has always said so,
and even the first version of the STL used pointers as iterators.
However, we also talked about ForwardIterator's value_type.
But an int* does not have a member called value_type; in fact, it has no members.
So how can an int* be a ForwardIterator?
It is because we say it is.
Using a concept_map, we say that when a T* is used where a ForwardIterator is required,
we consider the T its value_type:

A concept_map allows us to say how we want to see a type,
saving us from having to modify it or to wrap it into a new a type.
"Concept maps" is a very flexible and general mechanism for adapting independently developed software for common use.

Axioms

An axiom is a set of predicates specifying the semantics of a concept.
The primary use cases for axioms are external tools (e.g. not the common compiler actions), such as tools for domain-specific
optimizations (languages for specifying program transformations were a significant part of the motivation for axioms).
A secondary use is simply precise specification of semantics in the standard
(as is used in many parts of the standard library specification).
Axioms may also be useful for some optimizations (done by compilers and traditional optimizers), but compilers are
not required to take notice of user-supplied axioms; they work based on the semantics defined by the standard.

An axiom lists pairs of computations that may be considered equivalent.
Consider:

The <=> is the equivalence operator, which is used only in axioms.
Note that you cannot (in general) prove an axiom; we use axioms to state what we cannot prove,
but what a programmer can state to be an acceptable assumption.
Note that both sides of an equivalence statement may be illegal for some values, e.g. use of a NaN (not a number)
for a floating-point type: if both sides of an equivalence uses a NaN both are (obviously) invalid and equivalent
(independently of what the axiom says), but if only one side uses a NaN there may be opportunities for taking
advantage of the axiom.

An axiom is a sequence of equivalence statements (using <=>) and conditional statements
(of the form "if (something) then we may assume the following equivalence"):