C++11 New Features and Libraries¶
New Features¶
Move Segmentics¶
Moving an object means to transfer ownership of some resource it manage to another object.
Benefits:
- Performance optimization: while copying a temporary object(for example, a
vector
) to a list, withoutstd::move
you have to copy every element in vector and store them in new place.Moving
a vector is just copying some pointer and internal state over to the new one. - Make it possible to have only one instance at a time: for example,
std::unique_ptr
is non-copyable, but you can usemove
to transfer an instance between scopes at the language level.
Rvalue References¶
Rvalue reference
is a new reference. It's a non-template type(such as int
) and can be created with the syntax T &&
. It can be binded only to rvalues.
Forwarding References¶
Forwarding reference
is also known as universal references
.
- It can be created by
T&&
whenT
is a template type orauto&&
. - This enables
perfect forwarding
: the ability to pass arguments while maintaining their value category(e.g. lvalue stay as lvalue, temporaries are forwarded as rvalue).
Variadic Templates¶
The ...
syntax creates a parameter pack
or expands one. A template parameter pack
is a template parameter that accepts zero or more template arguments. A template with at least one parameter pack is called a variadic template
.
An exmple is as following:
1 2 3 4 5 6 |
|
Initializer Lists¶
A lightweight array-like container of elements created using a "braced list" syntax. For example, 1, 2, 3
creates a sequences of integars, that has type std::initializer_list<int>
. Useful as a replacement to passing a vector of objects to a function.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 |
|
Static Assertions¶
Assertions that are evaluated at compile-time.
Usage: static_assert(condition, string)
. For example:
1 2 3 |
|
x == y
is true, compiler will do nothing, else the compiler will report an error, the error message is x != y
.
auto
¶
auto
typed variables are deduced by the compiler according to the type of their initializer. However, if the compiler cannot determine the type of variable, it will report an error.
1 2 3 4 |
|
Functions can also deduce the return type using auto
.
1 2 3 4 5 6 7 |
|
Lambda Expressions¶
A lambda
is an unnamed function object capable of capturing variable in scope. It features:
- a capture list
- an optional set of parameters with an optional trailing return type
- a body
An example of capture list
:
[]
: capture nothing[=]
: capture local objects(local variables, parameters) in scope by value[&]
: cpature local objects(local variables, parameters) in scope by reference[this]
: capturethis
pointer by value[a, &b]
: capture objecta
by value andb
by reference
1 2 3 4 5 6 7 8 9 10 |
|
By default, value-captures cannot be modified inside the lambda because the complier-generated method is marked as const
. The mutable
keyword allows modifying captured variables. The keyword is placed after the parameter-list(which must be present even if it is empty).
1 2 3 4 5 6 7 |
|
decltype
¶
decltype
is an operator which returns the declared type of an expression passed to it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Type Aliases¶
Semantically similar to using a typedef
but using
of type aliases is easier to read and are compatible with templates.
1 2 3 4 5 6 7 8 9 10 |
|
nullptr
¶
C++11 introduces a new null pointer to replace C's NULL
macro. nullptr
is of type std::nullptr_t
and can be implicitly converted into pointer types, and unlike NULL
, not convertible to integral types except bool
.
1 2 3 4 |
|
Strongly-typed Enums¶
Type-safe enums that solve a variable of problems with C-style enums:
- implicit conversions
- inability to specify the underlying type
- scope pollutions
1 2 3 4 5 |
|
Attributes¶
Attributes provide a universal syntax over __attribute__(...)
, __declspec
, etc
1 2 3 4 |
|
constexpr
¶
constexp
is the expression that evaluated by the compiler at compile-time. It must be a const expression that compiler can evaluate at compile-time and can be used to indicate the variables, functions, etc.
1 2 |
|
The difference to const
:
const
variables can be initialized at run-time, butconstexp
variables must be initialized at compile-time
Delegating Constructors¶
Constructors can now call other constructors in the same class using an initializer list.
1 2 3 4 5 6 7 8 |
|
User-defined Literals¶
User-defined literals allow you to extend the language and add your own syntax. To create a literal, define:
1 |
|
T
with a name X
.
Note that the name of this function defines the name of the literal. Any literal names not starting with an underscore are reserved an won't be invoked.
String to integar conversion:
1 2 3 4 5 6 |
|
Explicit Virtual Overrides¶
Specifies that a virtual function overrides another virtual function. If the virtual function does not override a parent's virtual function, throw a compiler error.
1 2 3 4 5 6 7 8 9 10 |
|
Final Specifier¶
Specifies that a virtual function cannot be overridden in a derived class or that a class cannot be inherited from.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Default Functions¶
A more elegant, efficient way to provide a default implementation of a funtion, such as a constructor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Deleted Functions¶
A more elegant, efficient way to provide a deleted implementation of a function. Useful for preventing copied on objects.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Range-based For Loops¶
Syntactic sugar for iterating over a container's elements.
1 2 3 4 5 |
|
Special Member Function for Move Sementics¶
The copy constructor and copy assignment operator are called when copies are made, and with C++11's introduction of move semantics, there is now a move constructor and move assignment operator for moves.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Converting Constructors¶
Converting constructors will convert values of braced list syntax into constructor arguments.
1 2 3 4 5 6 7 8 9 10 |
|
Note that the braced list syntax does not allow narrowing:
1 2 3 4 5 6 |
|
Note that if a constructor accepts a std::initializer_list
, it will be called instead:
1 2 3 4 5 6 7 8 9 10 11 |
|
Explicit Convertion Functions¶
Conversion functions can now be made explicit using the explicit
specifier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Inline Namespaces¶
All members of an inline namespace are treated as if they were part of its parent namespace, allowing specialization of functions and easing the process of versioning. This is a transitive property, if A contains B, which in turn contains C and both B and C are inline namespace, C's member can be used as if they were on A.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Non-static Data Member Initializers¶
Allows non-static members to be initialized where they are declared, potentially cleaning up constructors of default initializations.
1 2 3 4 5 6 7 8 9 10 11 |
|
Right Angle Brackets¶
C++11 is now able to infer when a series of right angle brackets is used as an operator or as a closing statement of typedef, without having to add whitespaces.
1 2 |
|
Ref-qualified Member Functions¶
Member functions can now be qualified depending on whether *this
is an lvalue or rvalue reference.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Trailing Return Types¶
C++11 allows functions and lambdas an alternative syntax for specifying their return types.
1 2 3 4 5 6 7 8 9 10 11 |
|
This feature is especially useful when certain return types cannot be resolved:
1 2 3 4 5 6 7 8 9 10 11 |
|
Noexcept Specifier¶
The noexcept
specifier specifies whether a function could throw exceptions. It is an improved version of throw()
.
1 2 3 4 5 |
|
1 2 3 4 5 |
|
New Libraries¶
std::move
¶
std::move
indicates that the object passed to it may have its resources transferred. Using objects that have been moved from should be used with care, as they can be left in an unspecified state.
1 2 3 4 |
|
std::forward
¶
Return the arguments passed to it while maintaining their value category and cv-qualifiers. Useful for generic code and factories. Used in conjunction with forward reference
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
std::thread
¶
The std::thread
library provides a standard way to control threads, such as spawning and killing them. In the example below, multiple threads are spawned to do different calculations and then the program waits for all of them to finish.
1 2 3 4 5 6 7 8 9 10 |
|
std::to_string¶
Converts a numeric argument to a std::string
1 2 |
|
Type Traits¶
Type trait defines a compile-time template-based interfaces to query or modify the properties of types.
1 2 3 |
|
Smart Pointers¶
C++11 introduces new smart pointers:
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::auto_ptr
now becomes deprecated and then eventually removed in C++17
std::unique_ptr
is a non-copyable, movable pointer that manages its own heap-allocated memory.
Note: Prefer using the std::make_X
helper functions as opposed to using constructors.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
std::shared_ptr
is a smart pointer that manages a resource that is shared across multiple owners. A shared pointer holds a control block which has a few components such as the managed object and a reference counter. All control block is thread-safe, however, manipulating the managed object itself is not thread-safe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
std::chrono
¶
The chrono library contains a set of utility functions and types that deal with durations, clocks, and time points. One use case of this library is benchmarking code:
1 2 3 4 5 6 7 |
|
Tuples¶
Tuples are a fixed-size collection of heterogeneous values. Access the elements of a std::tuple
by unpacking using std::tie
or std::get
.
1 2 3 4 5 |
|
std::tie
¶
Creates a tuple of lvalue references. Useful for unpacking std::pair
and std::tuple
objects. Use std::ignore
as a placeholder for ignored values. In C++17, structured bindings shouhld be used instead.
1 2 3 4 5 6 7 |
|
std::array
¶
std::array
is a container built on top of a C-style array. Supports common container operations such as sorting.
1 2 3 |
|
Unordered Container¶
These containers maintain average constant-time complexity for search, insert, and remove operations. In order to achieve constant-time complexity, sacrifices order for speed by hashing elements into buckets. There are four unordered containers:
unordered_set
unordered_multiset
unordered_map
unordered_multimap
std::make_shared
¶
std::make_shared
is the recommanded way to create instance of std::shared_ptr
due to the following reasons:
- Avoid having to use the new operator.
- Prevents code repetition when specifying the underlying type the pointer shall hold.
- It provides exception-safety. Suppose we were calling a function
foo
like:
1 |
|
new T{}
, then function_that_throw()
, and so on. Since we have allocated data on the heap in the first construction of a T
we have introduced a leak here. With std::make_shared
, we are given exception-safety:
1 |
|
- Prevents having to do two allocations. When calling
std::shared_ptr{new T{}}
, we have to allocate memory forT
, then in the shared pointer we have to allocate memory for the control block within the pointer.
std::ref
¶
std::ref(val)
is used to create object of type std::reference_wrapper
that holds reference of val. Used in cases when usual reference passing using &
does not compile or &
is dropped due to type deduction. std::cref
is similar but created reference wrapper holds a const reference to val.
1 2 3 4 5 6 7 8 9 10 11 |
|
Memory Model¶
C++11 introduces a memory model for C++, which means library support for threading and atomic operations. Some of these operations include (but aren't limited to) atomic loads/stores, compare-and-swap, atomic flags, promises, futures, locks, and condition variables.
std::async
¶
std::async
runs the given function either asynchronously or lazily-evaluated, then returns a std::future
which holds the result of that function call.
The first parameter is the policy which can be:
std::launch::async
|std::launch::deferred
It is up to the implementation whether to perform asynchronous execution or lazy evaluation.std::launch::async
Run the callable object on a new thread.std::launch::deferred
Perform lazy evaluation on the current thread.
1 2 3 4 5 6 7 |
|
std::begin/end
¶
std::begin
and std::end
free functions were added to return begin and end iterators of a container generically. These functions also work with raw arrays which do not have begin and end member functions.
1 2 3 4 5 6 7 8 9 10 11 |
|