SlideShare una empresa de Scribd logo
1 de 129
Descargar para leer sin conexión
Welcome to

New C++ Standard

C++11
Dr. Partha Pratim Das
09/10-Dec-13

Overview of C++11

1
History of C++
 1998: ISO C++ Standard officially adopted (“C++98”).
776 pages.
 2003: TC1 (“Technical Corrigendum 1”) published
(“C++03”). Bug fixes for C++98.
 2005: TR1 (Library “Technical Report 1”) published. 14
likely new components for the standard library.
 2009: Selected “C++0x” features became commonly
available.
 2011: C++0x ratified ⇒ “C++11”. 1353 pages.
 2013: Full C++14 draft adopted. 1374 pages.
 2014: Revised C++ Standard (minor).
 2017?: Revised C++ Standard (major).
09/10-Dec-13

Overview of C++11

2
Source:
 Codes presented here have been shamelessly
lifted from: C++11 FAQ by Bjarne Stroustrup:
http://www.stroustrup.com/C++11FAQ.html
 However, the presenter has taken the liberty to
inject bugs at several places while creating his
own examples.
 A list of other sources (sparingly used) are
given at the end.

09/10-Dec-13

Overview of C++11

3
Features (Day 1)










Standard Types & long long
nullptr -- a null pointer literal
enum class -- scoped and
strongly typed enums
constexpr -- generalized and
guaranteed constant
expressions
Static (compile-time)
assertions -- static_assert
auto -- deduction of a type
from an initializer
decltype -- the type of an
expression
Suffix return type syntax

09/10-Dec-13












Initializer lists
Range-for statement
Uniform initialization syntax
and semantics
Preventing narrowing
Delegating constructors
In-class member initializers
Inherited constructors
Rvalue references
control of defaults: default and
delete
control of defaults: move and
copy

Overview of C++11

4
Features (Day 2)












Override controls: override
Override controls: final
“>>” as Nested Template
Closer
template alias (formerly known
as "template typedef")
Variadic Templates
Raw string literals
Lambdas
noexcept -- preventing
exception propagation
Explicit conversion operators
User-defined literals
unions (generalized)

09/10-Dec-13

Overview of C++11

5
Features (Not covered)













PODs (generalized)
Attributes
Local types as template
arguments
alignment
C99 features
Extended integer types
Dynamic Initialization and
Destruction with Concurrency
thread-local storage
(thread_local)
Unicode characters
Copying and rethrowing
exceptions
Extern templates
Inline namespace

09/10-Dec-13



And many more …

Overview of C++11

6
Standard Integer Types
C++03

C++11

 sizeof(int) == ?










 sizeof(char) ==
 1 byte (? bits)






sizeof(char) <=
sizeof(short) <=
sizeof(int) <=
sizeof(long)

09/10-Dec-13

int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t
int64_t
uint64_t

Overview of C++11

7
Standard Integer Types
C++03

C++11

 Fast Types

 Fast Types






int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t

 Least Types





int_least8_t
int_least16_t
int_least32_t
int_least64_t

 intmax_t
 intptr_t
09/10-Dec-13






uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t

 Least Types





uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t

 uintmax_t
 uintptr_t
Overview of C++11

8
Standard Integer Types
 What is the difference between the int
types int8_t, int_least8_t and int_fast8_t?
 Suppose you have a C compiler for a 36-bit system,
with char = 9 bits, short = 18 bits, int = 36 bits,
and long = 72 bits. Then





int8_t does not exist, because there is no way to satisfy the
constraint of having exactly 8 value bits with no padding.
int_least8_t is a typedef of char. NOT of short or int, because the
standard requires the smallest type with at least 8 bits.
int_fast8_t can be anything. It's likely to be a typedef of int if the
"native" size is considered to be "fast".

09/10-Dec-13

Overview of C++11

9
long long – a longer integer
 An integer that's at least 64 bits long. For example:
long long x = 9223372036854775807LL;
 No, there are no long long longs nor can long be
spelled short long long.

09/10-Dec-13

Overview of C++11

10
nullptr
C++03

C++11

void foo(char*)
{ cout << "char*" <<
endl; }

void foo(char*)
{ cout << "char*" <<
endl; }

void foo(int)
{ cout << "int" << endl;
}

void foo(int)
{ cout << "int" << endl;
}

foo(NULL);

foo(nullptr);

int

char *

09/10-Dec-13

Overview of C++11

11
enum class – scoped and
strongly typed enums
 The enum classes ("new enums", "strong
enums") address three problems with
traditional C++ enumerations:





conventional enums implicitly convert to int, causing
errors when someone does not want an enumeration to act
as an integer.
conventional enums export their enumerators to the
surrounding scope, causing name clashes.
the underlying type of an enum cannot be specified,
causing confusion, compatibility problems, and makes
forward declaration impossible.

 enum classes ("strong enums") are strongly
typed and scoped:
09/10-Dec-13

Overview of C++11

12
enum class – scoped and
strongly typed enums
C++03

C++11

enum Alert {green,yellow,red};
enum Color {red,blue}; // error
C2365: 'red' : redefinition;
previous definition was 'enumerator'
Alert a=7; // error C2440:
'initializing' : cannot convert from
'int' to 'main::Alert'
int a2=red; // ok: Alert->int
conversion
int a3=Alert::red; // warning C4482:
nonstandard extension used: enum
'main::Alert' used in qualified name

enum class Alert {green,yellow,red};
enum class Color:int {red,blue};
Alert a=7; // error: cannot convert
'int' to 'main()::Alert' in
initialization
Color c=7; // error: cannot convert
'int' to 'main()::Color' in
initialization
int a2=red; // error: 'red' was not
declared in this scope
int a3=Alert::red; // error: cannot
convert 'main()::Alert' to 'int' in
initialization
int a4=Color::blue; // error: cannot
convert 'main()::Color' to 'int' in
initialization
Color a5=Color::blue; // ok

09/10-Dec-13

Overview of C++11

13
enum class – scoped and
strongly typed enums
 Being able to specify the underlying type allow
simpler interoperability and guaranteed sizes of
enumerations:





enum class Color : char { red, blue };
// compact representation
enum class TrafficLight { red, yellow, green };
// by default, the underlying type is int
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
// how big is an E? "implementation defined"
enum EE : unsigned long
{ EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
// now we can be specific

09/10-Dec-13

Overview of C++11

14
enum class – scoped and
strongly typed enums


It also enables forward declaration of enums:

enum class Color_code : char; // forward declaration
void foobar(Color_code* p);
// use of forward
// declaration
// ...
enum class Color_code : char { red, yellow, green,
blue }; // definition


The underlying type must be one of the signed or unsigned
integer types; the default is int.

09/10-Dec-13

Overview of C++11

15
enum class – scoped and
strongly typed enums
 In the standard library, enum classes are used


For mapping systems specific error codes:
enum class errc;



For pointer safety indicators:
enum class pointer_safety
{ relaxed, preferred, strict };



For I/O stream errors:
enum class io_errc { stream = 1 };



For asynchronous communications error handling:
enum class future_errc
{ broken_promise,
future_already_retrieved,
promise_already_satisfied };

09/10-Dec-13

Overview of C++11

16
constexpr –
generalized and guaranteed constant
expressions
 The constexpr mechanism
 provides more general constant expressions
 allows constant expressions involving userdefined types
 provides a way to guarantee that an
initialization is done at compile time

09/10-Dec-13

Overview of C++11

17
constexpr –
generalized and guaranteed constant
expressions
 Consider
enum Flags { good=0, fail=1, bad=2, eof=4 };
constexpr int operator|(Flags f1, Flags f2)
{ return Flags(int(f1)|int(f2)); }
void f(Flags x) {
switch (x) {
case bad: /* ... */ break;
case eof: /* ... */ break;
case bad|eof: /* ... */ break;
default: /* ... */ break;
}
}

 In constexpr the function must be of a simple form so
that it can be evaluated at compile time if given constant
expressions arguments.
09/10-Dec-13

Overview of C++11

18
constexpr –
generalized and guaranteed constant
expressions
C++03

C++11

template<int N> struct Fib {
enum { value =
Fib<N-1>::value +
Fib<N-2>::value
};
};
template<> struct Fib<1> {
enum { value=1 };
};
template<> struct Fib<0>{
enum { value=0 };
};

constexpr int Fib(int n)
{
return n<2?
n:
Fib(n-1)+Fib(n-2);
}
cout<<Fib(10)<<endl; // Compile-time
int a=10;
cout<<Fib(a)<<endl; // Run-time

cout<<Fib<10>::value<<endl;
// Cannot be used at run-time
09/10-Dec-13

Overview of C++11

19
constexpr –
generalized and guaranteed constant
expressions
 This also works for objects for which the constructors are
simple enough to be constexpr and expressions
involving such objects:
struct Point {
int x,y;
constexpr Point(int xx, int yy):
x(xx), y(yy) { }
};
constexpr Point origo(0,0);
constexpr int z = origo.x;
constexpr Point a[] =
{ Point(0,0), Point(1,1), Point(2,2) };
constexpr int x = a[1].x; // x becomes 1
09/10-Dec-13

Overview of C++11

20
constexpr –
generalized and guaranteed constant
expressions
 constexpr & const are not replacements of each other
const

constexpr

The object is not modified through
an interface (however the object
may be modified through other
interfaces).

What can be computed at compile
time, making such computations
type safe.

const objects provide excellent
optimization opportunities for the
compiler.

Objects declared constexpr have
their initializer evaluated at compile
time.

If the address of a const object
isn't taken the compiler may
evaluate its initializer at compile
time and keep that object in its
tables rather than emitting it into
the generated code.

These are values kept in the
compiler's tables and only emitted
into the generated code if needed.

09/10-Dec-13

Overview of C++11

21
static_assert
 C++11
template<class T>
void f(T v) {
static_assert(sizeof(v) == 4,
"v must have size of 4 bytes");
//do something with v
}
void g() {
double v; // 8 bytes
f(v);
}
error C2338: v must have size of 4 bytes
09/10-Dec-13

Overview of C++11

22
static_assert
 Another example:
struct S { X m1; Y m2; };
static_assert(
sizeof(S)==sizeof(X)+sizeof(Y),"unexpected padding in S");

 static_assert works at compile-time and not with runtime values (use assert or test-and-throw)
int f(int* p, int n) {
static_assert(p==0,"p is not null");
// error: static_assert() expression not a constant expression
// ...
}

09/10-Dec-13

Overview of C++11

23
auto

How good is: auto x = GetX(); ?

C++03

C++11

map<string,string> m;
map<string,string>::iterator it
= m.begin();

map<string,string> m;
auto it = m.begin();

double const param =
config["param"];

auto const param =
config["param"];

singleton& s =
singleton::instance();

auto &s =
singleton::instance();

T *p=new T();

auto p = new T();

09/10-Dec-13

Overview of C++11

24
auto
template<class T> void printall(const vector<T>& v) {
for(auto p=v.begin(); p!=v.end(); ++p) cout << *p << "n";
} is better than
template<class T> void printall(const vector<T>& v) {
for (typename vector<T>::const_iterator p=v.begin();
p!=v.end(); ++p) cout << *p << "n";
}

When the type of a variable depends critically on template argument it can
be really hard to write code without auto. For example:
template<class T, class U>
void multiply(const vector<T>& vt, const vector<U>& vu)
{ // ...
auto tmp = vt[i]*vu[i];
// ...
}
09/10-Dec-13

Overview of C++11

25
•

decltype

•

decltype is an operator for querying
the type of an expression.
Similar to the sizeof operator, the
operand of decltype is unevaluated.

C++03

C++11

int i=4;
const int j=6;
const int &k=i;
int a[5];
int* p;
int var1;
int var2;
int var3;
int& var4=i;
const int var5=1;
const int& var6=j;
int var7[5];
int& var8=i;
int& var9=i;

int i=4;
const int j=6;
const int &k=i;
int a[5];
int* p;
decltype(i) var1;
decltype(1) var2;
decltype(2+3) var3;
decltype(i=1) var4=i;//no assignment
decltype(j) var5=1;
decltype(k) var6=j;
decltype(a) var7;
decltype(a[3]) var8=i;
decltype(*p) var9=i;

09/10-Dec-13

Overview of C++11

26
decltype
 decltype(E) is the type ("declared type") of the name
or expression E and can be used in declarations:
void f(const vector<int>& a, vector<float>& b) {
typedef decltype(a[0]*b[0]) Tmp;
for (int i=0; i<b.size(); ++i) {
Tmp* p = new Tmp(a[i]*b[i]);
// ...
}
// ...
}

 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.
09/10-Dec-13

Overview of C++11

27
Suffix Return Type Syntax


Consider:
template<class T, class U>
??? mul(T x, U y) { return x*y; }



How to write the return type? It's "the type of x*y" – but how
can we say that? First idea, use decltype:
template<class T, class U>
decltype(x*y) mul(T x, U y) // scope problem!
{ return x*y; }



That won't work because x and y are not in scope. So:
template<class T, class U>
decltype(*(T*)(0)**(U*)(0)) mul(T x, U y)
// ugly! and error prone
{ return x*y; }

09/10-Dec-13

Overview of C++11

28
Suffix Return Type Syntax
 Put the return type where it belongs, after the
arguments:
template<class T, class U>
auto mul(T x, U y) -> decltype(x*y)
{ return x*y; }
 We use the notation auto to mean "return type to be
deduced or specified later."

09/10-Dec-13

Overview of C++11

29
Suffix Return Type Syntax
 The suffix syntax is not primarily about templates and
type deduction, it is really about scope.
struct List {
struct Link { /* ... */ };
Link* erase(Link* p); // remove p and return
// the link before p
// ...
};
List::Link* List::erase(Link* p) { /* ... */ }

 The first List:: is necessary only because the scope
of List isn't entered until the second List::. Better:
auto List::erase(Link* p) -> Link* { /* ... */ }

 Now neither Link needs explicit qualification.
09/10-Dec-13

Overview of C++11

30
Initializer Lists
 Consider (doesn’t work in C++03)
vector<double> v = { 1, 2, 3.456, 99.99 };
list<pair<string,string>> languages = {
{"Nygaard","Simula"}, {"Richards","BCPL"}, {"Ritchie","C"}
};
map<vector<string>,vector<int>> years = {
{ {"Maurice","Vincent", "Wilkes"},{1913, 1945, 1951, 1967, 2000} },
{ {"Martin", "Ritchards"}, {1982, 2003, 2007} },
{ {"David", "John", "Wheeler"}, {1927, 1947, 1951, 2004} }
};

09/10-Dec-13

Overview of C++11

31
Initializer Lists
 Initializer lists are not just for arrays any more.
 The mechanism for accepting a {}-list is a function
(often a constructor) accepting an argument of
type std::initializer_list<T>. For example:
void f(initializer_list<int>);
f({1,2});
f({23,345,4567,56789});
f({}); // the empty list
f{1,2}; // error: function call ( ) missing
years.insert({{"Bjarne","Stroustrup"},{1950, 1975, 1985}});

 The initializer list can be of arbitrary length, but must be
homogeneous (all elements must be of a the template
argument type, T, or convertible to T).
09/10-Dec-13

Overview of C++11

32
Initializer Lists
 A container implements an initializer-list constructor as:
vector<int> v = {1,2,3,4,5}; // Following ctor is called
template<class E>
class vector {
public:
vector (std::initializer_list<E> s) {
// initializer-list constructor
reserve(s.size()); // get the right amount of space
uninitialized_copy(s.begin(), s.end(), elem);
// initialize elements (in elem[0:s.size()])
sz = s.size(); // set vector size
} // ... as before ...
};
09/10-Dec-13

Overview of C++11

33
Initializer Lists
 Alternatively,
vector<int>v={1,2,3,4,5};
template<class T>
class vector{
vector(initializer_list<T> args)
{/* rude, naïve implementation */
for(auto it=begin(args); it!=end(args); ++it)
push_back(*it);
}
//…
};

09/10-Dec-13

Overview of C++11

34
Initializer Lists
 initializer_list<T>is a light weight proxy object that
provides access to an array of objects of type T.
 A std::initializer_list object is automatically constructed
when:
vector<int> v{1,2,3,4,5}; // list-initialization
v={1,2,3,4,5}; // assignment expression
f({1,2,3,4,5}); // function call
for(int x:{1,2,3}) //ranged for loop
cout<<x<<endl;

09/10-Dec-13

Overview of C++11

35
Initializer Lists
 The distinction between direct initialization and copy
initialization is maintained for {}-initialization
 For example, std::vector has an explicit constructor
from int and an initializer-list constructor:
vector<double> v1(7); // ok: v1 has 7 elements
v1 = 9; // error: no conversion from int to vector
vector<double> v2 = 9;
// error: no conversion from int to vector
void f(const vector<double>&);
f(9); // error: no conversion from int to vector

09/10-Dec-13

Overview of C++11

36
Initializer Lists
 With initializer-list constructor:
vector<double> v1{7}; // ok: v1 has 1 element (with its value 7.0)
v1 = {9}; // ok v1 now has 1 element (with its value 9.0)
vector<double> v2 = {9}; // ok: v2 has 1 element (with its value 9.0)
f({9}); // ok: f is called with the list { 9 }

vector<vector<double>> vs = {
vector<double>(10), // ok: (10 elements)
vector<double>{10}, // ok: (1 element with value 10.0)
10 // error: vector's constructor is explicit
};

09/10-Dec-13

Overview of C++11

37
Initializer Lists
 Consider:
structT{
T(int,int);
T(initializer_list<int>);
};
T foo{10,20}; // calls initializer_list ctor
T bar(10,20); // calls first constructor

 Initializer-list constructors take precedence over other
constructors when the initializer-list constructor syntax is
used!
09/10-Dec-13

Overview of C++11

38
Initializer Lists
 The function can access the initializer_list as an
immutable sequence. For example:
void f(initializer_list<int> args) {
for (auto p=args.begin(); p!=args.end(); ++p)
cout << *p << "n"; }

 A constructor that takes a single argument of
type std::initializer_list is called an initializer-list
constructor.
 The standard library containers, string, and regex have
initializer-list constructors, assignment, etc.
 An initializer-list can be used as a range, e.g. in a range
for statement
 The initializer lists are part of the scheme for uniform
and general initialization.
09/10-Dec-13

Overview of C++11

39
Range – for, begin, end
C++03

C++11

for(i = 10; i >= 0; --i)
{ v.push_back(i); }
for(vector<int>::iterator i =
v.begin(); i!=v.end(); ++i)
cout << *i << " ";
cout << endl;

for(i = 10; i >= 0; --i)
{ v.push_back(i); }
for(auto d:v)
cout << d << " ";

sort(v.begin(),v.end());

sort(v.begin(),v.end());

for(vector<int>::iterator i =
v.begin();i!=v.end();++i)
cout << *i << " ";
cout << endl;

for(auto d:v)
cout << d << " ";

09/10-Dec-13

cout << endl;

cout << endl;

Overview of C++11

40
Range – for, begin, end






A range-for statement is to iterate through a 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 begin() & end()
are defined
void f(vector<double>& v) {
for (auto x : v) cout << x << 'n';
// A reference to allow change of value
for (auto& x : v) ++x;
}
for (const auto x : { 1,2,3,5,8,13,21,34 })
cout << x << 'n';
The begin() (and end()) can be member x.begin() or a freestanding function to be called begin(x).

09/10-Dec-13

Overview of C++11

41
Uniform Initialization Syntax
and Semantics
 C++ offers several ways of initializing an object
depending on its type and the initialization context.
When misused, the error can be surprising and the error
messages obscure. Consider:
string a[] = { "foo", " bar" };
// ok: initialize array variable
vector<string> v = { "foo", " bar" };
// error: initializer list for non-aggregate vector
void f(string a[]); f( { "foo", " bar" } );
// syntax error: block as argument

09/10-Dec-13

Overview of C++11

42
Uniform Initialization Syntax
and Semantics
 and
int a = 2; // "assignment style"
int aa[] = { 2, 3 }; // assignment style with list
complex z(1,2); // "functional style" initialization
x = Ptr(y); // "functional style" for
// conversion / cast / construction

 and
int a(1); // variable definition
int b(); // function declaration
int b(foo); // variable definition or
// function declaration

 It can be hard to remember the rules for initialization
and to choose the best way.
09/10-Dec-13

Overview of C++11

43
Uniform Initialization Syntax
and Semantics
 The C++11 solution is to allow {}-initializer lists for all
initialization:
struct X { int x; int y; };
X x1 = X{1,2};
X x2 = {1,2}; // the = is optional
X x3{1,2};
X* p = new X{1,2};
struct D: X {
D(int x, int y): X{x, y} { /* ... */ };
};
struct S {
int a[3];
S(int x, int y, int z): a{x, y, z} { /* ... */ };
};
09/10-Dec-13

Overview of C++11

44
Uniform Initialization Syntax
and Semantics
 Importantly, X{a} constructs the same value in every
context, so that {}-initialization gives the same result in
all places where it is legal. For example:
X x{a};
X* p = new X{a};
z = X{a}; // use as cast
f({a}); // function argument (of type X)
return {a}; // function return value (function returning X)

09/10-Dec-13

Overview of C++11

45
Uniform Initialization Syntax
and Semantics
C++03

C++11

int a[]={1,2,3,4,5};
vector<int> v;
for(int i=1;i<=5;++i) v.push_back(i);

int a[]={1,2,3,4,5};
vector<int> v={1,2,3,4,5};

map<int,string> labels;
labels.insert(make_pair(1,“Open”));
labels.insert(make_pair(2,“Close”));
labels.insert(make_pair(3,“Reboot”));

map<int,string> labels{
{1,"Open"},
{2,"Close"},
{3,"Reboot"}};

Vector3 normalize(const Vector3& v){
float inv_len=1.f/length(v);
return Vector3(v.x*inv_len,
v.y*inv_len, v.z*inv_len);
}

Vector3 normalize(const Vector3& v){
float inv_len=1.f/length(v);
return {v.x*inv_len, v.y*inv_len,
v.z*inv_len};
}

Vector3 x=normalize(Vector3(2,5,9));
Vector3 y(4,2,1);

Vector3 x=normalize({2,5,9});
Vector3 y{4,2,1};

09/10-Dec-13

Overview of C++11

46
Uniform Initialization Syntax and
Semantics
C++03

C++11

struct B{
B(){}
};

struct B{
B(){}
};

struct A{
A(B){}
void f(){}
};

struct A{
A(B){}
void f(){}
};

int main(){
A a(B()); // function declaration!

int main(){
A a{B()}; // calls B ctor,then A ctor

a.f();//compile error!

a.f(); // calls A::f

return 0;

return 0;

}

}

09/10-Dec-13

Overview of C++11

47
Prevent Narrowing
 The problem: C and C++ implicitly truncates:
int x = 7.3; // Ouch!
void f(int);
f(7.3); // Ouch!

 However, in C++11, {} initialization doesn't narrow:
int x0 {7.3}; // error: narrowing
int x1 = {7.3}; // error: narrowing
double d = 7;
int x2{d}; // error: narrowing (double to int)
char x3{7}; // ok: 7 is an int, yet this is not narrowing
vector<int> vi = { 1, 2.3, 4, 5.6 };
// error: double to int narrowing
09/10-Dec-13

Overview of C++11

48
Prevent Narrowing
 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:
char c1{7}; // OK: 7 is an int, but it fits in a char
char c2{77777}; // error: narrowing (assuming 8-bit chars)

 Note that floating-point to integer conversions are
always considered narrowing -- even 7.0 to 7.

09/10-Dec-13

Overview of C++11

49
Delegating Constructor
C++03

C++11

class A {
int a;
void validate(int x) {
if (0<x && x<=42) a=x;
else
cout << "Fail " << x;
}
public:
A(int x) {validate(x);}
A() {validate(42);}
A(string s) {
int x = atoi(s.c_str());
validate(x);
}
};

class A {
int a;
public:
A(int x) {
if (0<x && x<=42) a=x;
else
cout << "Fail " << x;
}
A():A{42}{}
A(string s):
A{atoi(s.c_str())}{}
};

09/10-Dec-13

Overview of C++11

50
In-class Member Initializers


In C++03, 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:
int var = 7;
class X {
static const int m1 = 7; // ok
const int m2 = 7; // error: not static
static int m3 = 7; // error: not const
static const int m4 = var;
// error: initializer not constant expression
static const string m5 = "odd"; // error: not integral type
// ...
};

09/10-Dec-13

Overview of C++11

51
In-class Member Initializers


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) {}
};

09/10-Dec-13

Overview of C++11

52
In-class Member Initializers
C++03

C++11

class A {
public:
A(): a(4), b(2),
h("text1"), s("text2")
{}
private:
int a;
int b;
string h;
string s;
};

class A {
public:
A(){}
private:
int a=4;
int b=2;
string h="text1";
string s="text2";
};

09/10-Dec-13

Overview of C++11

53
In-class Member Initializers
class A {
public:
A(): a(7), b(5),
hash_algorithm("MD5"), s("Constructor run") {}
A(int a_val): a(a_val), b(5),
hash_algorithm("MD5"), s("Constructor run") {}
A(D d): a(7), b(g(d)),
hash_algorithm("MD5"), s("Constructor run") {}
int a, b;
private:
HashingFunction hash_algorithm; // Cryptographic hash
// for all instances
std::string s; // String indicating state
// in object lifecycle
};
09/10-Dec-13

Overview of C++11

54
In-class Member Initializers
class A {
public:
A(): a(7), b(5) {}
A(int a_val): a(a_val), b(5) {}
A(D d): a(7), b(g(d)) {}
int a, b;
private:
HashingFunction hash_algorithm{"MD5"}; // Cryptographic hash
// for all instances
std::string s{"Constructor run"}; // String indicating state
// in object lifecycle
};

09/10-Dec-13

Overview of C++11

55
In-class Member Initializers
class A {
public:
A() {}
A(int a_val): a(a_val) {}
A(D d): b(g(d)) {}
int a = 7; int b = 5;
private:
HashingFunction hash_algorithm{"MD5"}; // Cryptographic hash
// for all instances
std::string s{"Constructor run"}; // String indicating state
// in object lifecycle
};

09/10-Dec-13

Overview of C++11

56
Inherited Constructors


A member of a base class is not in the same scope as a
member of a derived class:
struct B { void f(double); };
struct D : B { void f(int); };
B b; b.f(4.5); // fine
D d; d.f(4.5); // surprise: calls f(int) with argument 4



"lift" a set of overloaded functions (excluding ctors) from a
base class into a derived class:
struct B { void f(double); };
struct D : B {
using B::f; // bring all f()s from B into scope
void f(int); // add a new f()
};
B b; b.f(4.5); // fine
D d; d.f(4.5); // fine: calls D::f(double) which is B::f(double)

09/10-Dec-13

Overview of C++11

57
Inherited Constructors


C++11 provides the facility to ‘lift’ constructors:
class Derived : public Base {
public:
using Base::f; // lift Base's f into Derived's scope
// -- works in C++03
void f(char); // provide a new f
void f(int); // prefer this f to Base::f(int)
using Base::Base; // lift Base constructors into
// Derived's scope -- C++11 only
Derived(char); // provide a new constructor
Derived(int); // prefer this constructor to
Base::Base(int)
// ...
};

09/10-Dec-13

Overview of C++11

58
Inherited Constructors


Caveat – inheriting constructors in a derived class in which you
define new member variables needing initialization:
struct B1 {
B1(int) { }
};
struct D1 : B1 {
using B1::B1; // implicitly declares D1(int)
int x;
};
void test() {
D1 d(6); // Oops: d.x is not initialized
D1 e; // error: D1 has no default constructor
}

09/10-Dec-13

Overview of C++11

59
Inherited Constructors


Fix by in-class initialization:
struct D1 : B1 {
using B1::B1; // implicitly declares D1(int)
int x{0}; // note: x is initialized
};
void test() {
D1 d(6); // d.x is zero
}

09/10-Dec-13

Overview of C++11

60
Rvalue References
 In the context of:
int lval = 5; // an lvalue
5; // an rvalue
int f() { return 0; }

 Non-const references can bind to lvalues
int& ref_lval = lval; // ok

 And const references can bind to lvalues or rvalues
const int& const_ref_lval = lval; // ok
const int& const_ref_rval = 5; // ok
const int& const_ref_rval = f(); // ok

 But there is nothing that can bind to a non-const rvalue.
int& ref_rval = 5; // cannot convert from 'int' to 'int &‘
int& ref_rval = f(); // cannot convert from 'int' to 'int &'

09/10-Dec-13

Overview of C++11

61
Rvalue References
 This is to protect people from changing the values of
temporaries that are destroyed before their new value
can be used.
void incr(int& a) { ++a; }
int i = 0;
incr(i); // i becomes 1
incr(0); // error: 0 in not an lvalue

 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.
09/10-Dec-13

Overview of C++11

62
Rvalue References



An rvalue reference binds to an rvalue (but not to an lvalue).
The && indicates an "rvalue reference".

int&& ref_rval = 5;
int&& ref_rval = lval; // cannot convert from
// 'int' to 'int &&‘ –
// bind is an lvalue
int&& ref_rval = lval+5;
int&& ref_rval = f();
 In simple terms, an rvalue reference can be set to an expression
whose address cannot be taken:

&5; &(lval+5); &f() // error: requires an lvalue
&lval // ok: has an address
09/10-Dec-13

Overview of C++11

63
Rvalue References


Why are we doing all this? 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).
We do not need copies at all. We just wanted to move the
values of a, b, and tmp around a bit.



09/10-Dec-13

Overview of C++11

64
Rvalue References
 C++11 defines "move constructors" and "move
assignments" to move rather than copy their argument:
template<class T>
class vector { // ...
vector(const vector&); // copy constructor
vector(vector&&); // move constructor
vector& operator=(const vector&); // copy assignment
vector& operator=(vector&&); // move assignment
}; // note: move constructor and
// move assignment takes non-const &&
// they can, and usually do, write to their argument

09/10-Dec-13

Overview of C++11

65
Rvalue References
 move assignment 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).

09/10-Dec-13

Overview of C++11

66
Rvalue References


How do we know whether it's ok to simply move from a
source? We tell the compiler:
template<class T>
void swap(T& a, T& b) { // "perfect swap" (almost)
T tmp = move(a); // could invalidate a
a = move(b); // could invalidate b
b = move(tmp); // could invalidate tmp
}




move(x) means "you can treat x as an rvalue".
In C++11 move() template function uses rvalue references.
template <class T>
typename remove_reference<T>::type&&
move(T&& a) { return a; }

09/10-Dec-13

Overview of C++11

67
Control of defaults:
default and delete
 “Prohibiting copying” idiom:
class X { // ...
X& operator=(const X&) = delete; // Disallow copy
X(const X&) = delete;
};

 Conversely, we can explicitly ask for default copy
behavior:
class Y { // ...
Y& operator=(const Y&) = default; // default copy
Y(const Y&) = default;
};

09/10-Dec-13

Overview of C++11

68
Control of defaults:
default and delete
 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
};

09/10-Dec-13

Overview of C++11

69
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; consider all and explicitly define or default
or delete the ones you want.
Copying, moving, and destruction are closely related operations, rather
than being individual operations that you can freely mix and match.
Only a few combinations make sense semantically.
If any move, copy, or destructor is explicitly specified (declared,
defined, =default, or =delete) by the user:



no move is generated by default.
any undeclared copy operations are generated by default, but this is
deprecated, so don't rely on that.

09/10-Dec-13

Overview of C++11

70
Control of defaults:
move and copy
Move / Copy / Destructor Specs

Implicit Implication

class X1 {
X1& operator=(const X1&) =
delete; // Disallow copying
};

Disallows moving of X1s.
Copy initialization is allowed,
but deprecated.

class X2 {
X2& operator=(const X2&) =
default;
};

Disallows moving of X2s.
Copy initialization is allowed,
but deprecated.

class X3 {
X3& operator=(X3&&) = delete;
// Disallow moving
};

Disallows copying of X3s.

class X4 { ~X4() =
delete; // Disallow destruction
};

Disallows moving of X4s.
Copying is allowed, but
deprecated.

09/10-Dec-13

Overview of C++11

71
Control of defaults:
move and copy


Example: No move. No Copy

template<class T>
class Handle {
T* p;
public:
Handle(T* pp): p{pp} {}
~Handle() { delete p; } // user-defined destructor: no implicit copy or move
Handle(Handle&& h) = delete; // no move
Handle& operator=(Handle&& h) = delete; // no move

Handle(const Handle&) = delete; // no copy
Handle& operator=(const Handle&) = delete; // no copy
void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; }
};

09/10-Dec-13

Overview of C++11

72
Control of defaults:
move and copy


Example: No Move. Only Copy

template<class T>
class Handle {
T* p;
public:
Handle(T* pp): p{pp} {}
~Handle() { delete p; } // user-defined destructor: no implicit copy or move
Handle(Handle&& h) = delete; // no move
Handle& operator=(Handle&& h) = delete; // no move

Handle(const Handle& h): p{h.p} {}; // copy ownership
Handle& operator=(const Handle& h)
{ delete p; p=h.p; return *this; } // copy ownership
void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; }
};

09/10-Dec-13

Overview of C++11

73
Control of defaults:
move and copy


Example: Move and No Copy

template<class T>
class Handle {
T* p;
public:
Handle(T* pp): p{pp} {}
~Handle() { delete p; } // user-defined destructor: no implicit copy or move
Handle(Handle&& h): p{h.p} { h.p=nullptr; }; // transfer ownership
Handle& operator=(Handle&& h)
{ delete p; p=h.p; h.p=nullptr; return *this; } // transfer ownership
Handle(const Handle& h) = delete; // no copy
Handle& operator=(const Handle& h) = delete; // no copy
void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; }
};

09/10-Dec-13

Overview of C++11

74
Control of defaults:
move and copy


Example: Move and Copy

template<class T>
class Handle {
T* p;
public:
Handle(T* pp): p{pp} {}
~Handle() { delete p; } // user-defined destructor: no implicit copy or move
Handle(Handle&& h): p{h.p} { h.p=nullptr; }; // transfer ownership
Handle& operator=(Handle&& h)
{ delete p; p=h.p; h.p=nullptr; return *this; } // transfer ownership
Handle(const Handle& h): p{h.p} {}; // copy ownership
Handle& operator=(const Handle& h)
{ delete p; p=h.p; return *this; } // copy ownership
void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; }

};
09/10-Dec-13

Overview of C++11

75
Control of defaults:
move and copy


Example: Move and Copy Version
int *p = new int(5);
cout << "Raw: " << *p << endl;
Handle<int> h1(p);
cout << "h1: "; h1.Print();

Raw
h1:
h2:
h1:
h3:
h2:

Handle<int> h2{move(h1)};
cout << "h2: "; h2.Print();
cout << "h1: "; h1.Print();

Handle<int> h3{h2};
cout << "h3: "; h3.Print();
cout << "h2: "; h2.Print();

09/10-Dec-13

Overview of C++11

= 5
5
5
NULL
5
5

76
override


Consider the overriding rules:

struct B {
virtual void
virtual void
virtual void
void k(); //
};
struct D : B {
void f(); //
void g(); //
//
virtual void
//
void k(); //
//
//
};
09/10-Dec-13

f();
g() const;
h(char);
not virtual






overrides B::f()
doesn't override
B::g(): wrong type
h(char);
overrides B::h()
doesn't override
B::k() - B::k() is
not virtual

Did the programmer mean to
override B::g()? (almost
certainly yes).
Did the programming mean to
override B::h(char)? (probably
not because of the redundant
explicit virtual).
Did the programmer mean to
override B::k()? (probably, but
that's not possible).

Overview of C++11

77
override


To allow the programmer to be more explicit about overriding, we now
have the "contextual keyword" override:
struct D : B {
void f() override; //
void g() override; //
virtual void h(char);
void k() override; //
};





OK: overrides B::f()
error: wrong type
// overrides B::h(); likely warning
error: B::k() is not virtual

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:
int override = 7; // not recommended

09/10-Dec-13

Overview of C++11

78
override
C++03

C++11

struct Base {
virtual void f(float) {
cout << "Base::fn"; }
};
struct Derived:Base {
virtual void f(float) {
cout << "Derived::fn";
} //warning
};
Derived myD;
Base *p = &myD;
p->f(2);
Derived::f

struct Base {
virtual void f(float) {
cout << "Base::fn"; }
};
struct Derived:Base {
void f(float) override {
cout << "Derived::fn";
}
};
Derived myD;
Base *p = &myD;
p->f(2);
Derived::f

09/10-Dec-13

Overview of C++11

79
override
C++03

C++11

struct Base {
virtual void f(float) {
cout << "Base::fn"; }
};
struct Derived:Base {
virtual void f(int) {
cout << "Derived::fn";
} //warning
};
Derived myD;
Base *p = &myD;
p->f(2);
Base::f

struct Base {
virtual void f(float) {
cout << "Base::fn"; }
};
struct Derived:Base {
void f(float) override {
cout << "Derived::fn";
}
};
Derived myD;
Base *p = &myD;
p->f(2);
Derived::f

09/10-Dec-13

Overview of C++11

80
override
C++03

C++11

struct Base {
virtual void f(float) {
cout << "Base::fn"; }
};
struct Derived:Base {
virtual void f(int) {
cout << "Derived::fn";
} //warning
};
Derived myD;
Base *p = &myD;
p->f(2);
Base::f

struct Base {
virtual void f(float) {
cout << "Base::fn"; }
};
struct Derived:Base {
void f(int) override {
cout << "Derived::fn";
}
};

09/10-Dec-13

'Derived::f' : method with
override specifier 'override'
did not override any base class
methods

Overview of C++11

81
override controls: final –
preventing inheritance
C++03

C++03

class Base {
public:
Base(){}
};
class Derived: public Base {};

class Base {
public:
static Base *Instance() {
return new Base;
}
private:
Base() {};
};
class Derived: public Base {};

Base b; // Ok
Derived d; // Ok

Inheritance cannot be prevented;
instantiation of objects of inherited
class can be prevented.

09/10-Dec-13

Base b; // Error
Base *pb = Base::Instance();
Derived d; // Error

Overview of C++11

82
override controls: final –
preventing inheritance
C++03

C++03

class Base {
public:
virtual void f();
};
class Derived: public Base {
public:
void f();
};

class BaseX {
public: BaseX() {};
virtual void f();
};
class DerivedX: public BaseX {
public: DerivedX() {};
private: void f()
{ cout << "DerivedXn"; };
};
class MoreDerivedX: public
DerivedX { };

It is not easy to stop inheritance of
virtual member functions.
Also, errors cannot come from class
compilation.
09/10-Dec-13

MoreDerivedX mdx;
mdx.f(); // Error

Overview of C++11

83
override controls: final –
preventing inheritance
C++03

C++11

struct Base1{};
struct Derived1: public Base1 {
};

struct Base1 final {};
struct Derived1: public Base1 {
// Error
};

struct Base2 {
virtual void f();
};
struct Derived2: public Base2 {
void f();
};

09/10-Dec-13

struct Base2 {
virtual void f() final;
};
struct Derived2: public Base2 {
void f(); // Error
};

Overview of C++11

84
override controls: final –
preventing inheritance
Java

C++11

final class Base1{}
class Derived1 extends Base1{
//error
}

struct Base1 final {};
struct Derived1: public Base1 {
// Error
};

class Base2{
public final void f(){};
}
class Derived2 extends Base2{
public void f(){};//error
}

struct Base2 {
virtual void f() final;
};
struct Derived2: public Base2 {
void f(); // Error
};

09/10-Dec-13

Overview of C++11

85
“>>” as Nested Template Closer


Consider
list<vector<string>> lvs;





In C++03 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)

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.

09/10-Dec-13

Overview of C++11

86
“>>” as Nested Template Closer
C++03

C++11

std::vector<std::list<int>> vi1;
// Error

std::vector<std::list<int>> vi1;
// Ok

std::vector<std::list<int> > vi2;
// Ok

std::vector<std::list<int> > vi2;
// Ok

const int n = … ; // n, m are
const int m = … ; // constants

const int n = … ; // n, m are
const int m = … ; // constants

std::list<std::array<int, n>>2 >>
L1; // error: 2 shifts

std::list<std::array<int, n>>2 >>
L1; // error: 1st “>>” closes
// both templates

std::list<std::array<int, (n>>2) >>
L2; // error: 2 shifts

std::list<std::array<int, (n>>2) >>
L2; // Ok

09/10-Dec-13

Overview of C++11

87
Template Alias
(aka Template Typedef)
template<class T>
using Vec = std::vector<T,My_alloc<T>>;
// standard vector using my allocator

Vec<int> fib = { 1, 2, 3, 5, 8, 13 };
// allocates elements using My_alloc
vector<int,My_alloc<int>> verbose = fib;
// verbose and fib are of the same type




The keyword using is used to get a linear notation "name
followed by what it refers to."
Cannot use typedef for the same purpose

09/10-Dec-13

Overview of C++11

88
Template Alias
(aka Template Typedef)
 Specialization works (you can alias a set of
specializations but you cannot specialize an alias):
template<int>
// idea: int_exact_trait<N>::type is a type with exactly N bits
struct int_exact_traits { typedef int type; };
template<> struct int_exact_traits<8> { typedef char type; };
template<> struct int_exact_traits<16> { typedef char[2] type; };
// ...
template<int N>
using int_exact = typename int_exact_traits<N>::type;
// define alias for convenient notation

int_exact<8> a = 7; // int_exact<8> is an int with 8 bits
09/10-Dec-13

Overview of C++11

89
Template Alias
(aka Template Typedef)
 Type aliases can also be used as a different syntax for
ordinary type aliases:
typedef void (*PFD)(double); // C style
using PF = void (*)(double); // using plus C-style type
using P = [](double)->void; // using plus suffix return type

09/10-Dec-13

Overview of C++11

90
Variadic Templates
 Type-safe printf():
const string pi = "pi";
const char* m =
"The value of %s is about %g (unless you live in %s).n";
printf(m, pi, 3.14159, "Indiana");

09/10-Dec-13

Overview of C++11

91
Variadic Templates
 The simplest case of printf() is when there are no
arguments except the format string:
void printf(const char* s) {
while (s && *s) {
// make sure that there wasn't meant to be more
// arguments %% represents plain % in a format string
if (*s=='%' && *++s!='%')
throw runtime_error(
"invalid format: missing arguments");
std::cout << *s++;
}
}

09/10-Dec-13

Overview of C++11

92
Variadic Templates
 Next we handle printf() with more arguments:
template<typename T, typename... Args> // note "..."
void printf(const char* s, T value, Args... args) { // note "..."
while (s && *s) {
if (*s=='%' && *++s!='%') { // a format specifier
// (ignore which one it is)

std::cout << value;
printf(++s, args...);

// use first non-format argument
// "peel off" first argument

return; // Code on the site is wrong!
}
std::cout << *s++;

}
throw std::runtime error("extra arguments provided to printf");
}

09/10-Dec-13

Overview of C++11

93
Variadic Templates
 This code simply ''peels off'' the first nonformat argument and then calls itself
recursively.
 When there are no more non-format
arguments, it calls the first
(simpler) printf() (above).
 Functional programming done at compile time.
 Note how the overloading of << replaces the
use of the (possibly erroneous) ''hint'' in the
format specifier.
09/10-Dec-13

Overview of C++11

94
Variadic Templates





Args... is a ''parameter pack'' – a sequence of (type / value)
pairs to ''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.
Continues till args is empty when the first printf() is called.

09/10-Dec-13

Overview of C++11

95
Variadic Templates


We build a variadic type:
// Helper type traits
template<typename T> struct
template<typename T> struct
template<typename T> struct
template<typename T> struct
{ typedef T const &type; };

add_reference { typedef T &type; };
add_reference<T&> { typedef T &type; };
add_const_reference { typedef T const &type; };
add_const_reference<T&>

template<typename... Values> class myTuple;
// Basis case: zero-length tuple
template<> class myTuple<> {};

09/10-Dec-13

Overview of C++11

96
Variadic Templates
template<typename Head, typename... Tail>
class myTuple<Head, Tail...>: private myTuple<Tail...> {
typedef myTuple<Tail...> inherited;
public:
myTuple() {}
myTuple(typename add_const_reference<Head>::type v,
typename add_const_reference<Tail>::type... vtail) // Construct from arguments.
: m_head(v), inherited(vtail...) {}
template<typename... VValues>// Construct tuple from another tuple.
myTuple(const myTuple<VValues...>& other)
: m_head(other.head()), inherited(other.tail()) {}
template<typename... VValues>// Copy Assignment
myTuple& operator=(const myTuple<VValues...>& other)
{ m_head = other.head(); tail() = other.tail(); return *this; }
typename add_reference<Head>::type head() { return m_head; }
typename add_reference<const Head>::type head() const { return m_head; }
inherited& tail() { return *this; }
const inherited& tail() const { return *this; }
protected:
Head m_head;
};
09/10-Dec-13
Overview of C++11
97
Variadic Templates
void test_tuple() {
myTuple<> t0a;
myTuple<> t0b(t0a);
t0a = t0b;
myTuple<int> t1a;
myTuple<int> t1b(17);
myTuple<int> t1c(t1b);
t1a = t1b;
myTuple<float> t1d(3.14159);
myTuple<float> t1e(t1d);
t1d = t1e;
myTuple<vector<int>,string,int> tt({1,2,3},"hello",5);
string h = tt.tail().head();
// "hello"
myTuple<string,int> t2 = tt.tail(); // {,"hello",5};
}

09/10-Dec-13

Overview of C++11

98
Raw String Literals






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 (ww):
string s = "ww"; // 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"(ww)";
// I'm pretty sure I got that right

09/10-Dec-13

Overview of C++11

99
Raw String Literals
C++03

C++11

string test="C:ABCDfile1.txt";
cout<<test<<endl;

string test=R"(C:ABCDfile1.txt)";
cout<<test<<endl;

C:ABCDfile1.txt

C:ABCDfile1.txt

string test;
test="FirstLine.nSecondline.nThirdLine.n";
cout<<test<<endl;

string test;
test=R"(FirstLine.nSecondline.nThirdLine.n)";
cout<<test<<endl;

FirstLine.
Secondline.
ThirdLine.

FirstLine.nSecondline.nThirdLine.n

string test=
R"(FirstLine.
Secondline.
ThirdLine.)";
cout<<test<<endl;

FirstLine.
Secondline.
ThirdLine.

09/10-Dec-13

Overview of C++11

100
lambdas



A lambda expression specifies a function object.
The primary use for a lambda is to specify a simple action to
be performed by some function. For example:
vector<int> v = {50, -10, 20, -30};
std::sort(v.begin(), v.end()); // the default sort
// now v should be { -30, -10, 20, 50 }
// sort by absolute value:
std::sort(v.begin(), v.end(),
[](int a, int b) { return abs(a)<abs(b); });
// now v should be { -10, 20, -30, 50 }



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.

09/10-Dec-13

Overview of C++11

101
lambdas


A lambda expression can access local variables in the scope in
which it is used. For example:
void f(vector<Record>& v) {
vector<int> indices(v.size());
int count = 0;
generate(indices.begin(),indices.end(),
[&count](){ return count++; });
// sort indices in the order determined
// by the name field of the records:
std::sort(indices.begin(), indices.end(),
[&](int a, int b) { return v[a].name<v[b].name; });
// ...
}

09/10-Dec-13

Overview of C++11

102
lambdas
Ram
struct Record { string name; };
Shyam
void f(vector<Record>& v) {
Jadu
vector<int> indices(v.size());
Madhu
for(auto i:indices) cout << i << " "; cout << endl;
0 0 0 0
int count = 0;
0 1 2 3
generate(indices.begin(),indices.end(),
2 3 0 1
[&count](){ return count++; });
for(auto i:indices) cout << i << " "; cout << endl;
// sort indices in the order of the name field of the records:
std::sort(indices.begin(), indices.end(),
[&](int a, int b) { return v[a].name<v[b].name; });
for(auto i:indices) cout << i << " "; cout << endl;
}
vector<Record> nameRecs = {{"Ram"}, {"Shyam"}, {"Jadu"}, {"Madhu"}};
for(auto m:nameRecs) cout << m.name << endl;
f(nameRecs);
09/10-Dec-13

Overview of C++11

103
lambdas
 Using named function object:
void f(vector<Record>& v) {
vector<int> indices(v.size());
int count = 0;
generate(indices.begin(),indices.end(),
[&](){ return ++count; });
struct Cmp_names {
const vector<Record>& vr;
Cmp_names(const vector<Record>& r) :vr(r) { }
bool operator()(int a, int b) const
{ return vr[a].name<vr[b].name; }
}; // sort indices in the order of the name field of the records:
std::sort(indices.begin(), indices.end(), Cmp_names(v));
}
09/10-Dec-13

Overview of C++11

104
lambdas
 To specify a lambda we must provide


its capture list: the list of variables it can use (in addition
to its arguments):






Capture nothing is []
Capture all by references is [&] (can specify specific variables), and
Capture all by value is [=] (can specify specific variables).

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



The action to be performed as a block
{ 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.

09/10-Dec-13

Overview of C++11

105
noexcept – preventing
exception propagation
 If a function cannot throw an exception or
 If the program isn't written to handle exceptions thrown
by a function, that function can be declared noexcept.
extern "C" double sqrt(double) noexcept; // will never throw
vector<double> my_computation(const vector<double>& v)
noexcept { // Not prepared to handle memory exhaustion
vector<double> res(v.size()); // might throw
for(int i; i<v.size(); ++i) res[i] = sqrt(v[i]);
return res;
}

 If a function declared noexcept throws, the program is
terminated (by a call to terminate()).
 The call of terminate() cannot rely on objects being in
well-defined states
09/10-Dec-13

Overview of C++11

106
noexcept – preventing
exception propagation
 noexcept is different from nothrow that
guarantees not to throw.
 It is possible 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:
template<class T>
void do_f(vector<T>& v) noexcept(noexcept(f(v.at(0))))
// can throw if f(v.at(0)) can
{ for(int i; i<v.size(); ++i) v.at(i) = f(v.at(i)); }
09/10-Dec-13

Overview of C++11

107
noexcept – preventing
exception propagation
 Here, noexcept is first used 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.

 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.

09/10-Dec-13

Overview of C++11

108
noexcept – preventing
exception propagation
 A destructor shouldn't throw; a
generated destructor is
implicitly noexcept.
 It is typically a bad idea to have a move
operation throw, so declare
those noexcept wherever possible.
 noexcept is widely and systematically
used in the standard library to improve
performance and clarify requirements.
09/10-Dec-13

Overview of C++11

109
Explicit Conversion Operators


C++03 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:
struct S { S(int); };
// "ordinary constructor" defines implicit conversion
S s1(1); // ok
S s2 = 1; // ok
void f(S);
f(1); // ok (but that's often a bad surprise - what if S was vector?)
struct E { explicit E(int); }; // explicit constructor
E e1(1); // ok
E e2 = 1; // error (but that's often a surprise)
void f(E);
f(1); // error (protects against surprises -- e.g. std::vector's
constructor from int is explicit)

09/10-Dec-13

Overview of C++11

110
Explicit Conversion Operators


However, a constructor is not the only mechanism for defining
a conversion. If we can't modify a class, we can define a
conversion operator from a different class. For example:
struct S { S(int) { } /* ... */ };
struct SS {
int m;
SS(int x) :m(x) { }
operator S() { return S(m); }
// because S don't have S(SS); non-intrusive
};
SS ss(1);
S s1 = ss; // ok; like an implicit constructor
S s2(ss); // ok ; like an implicit constructor
void f(S);
f(ss); // ok; like an implicit constructor

09/10-Dec-13

Overview of C++11

111
Explicit Conversion Operators


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:
struct S { S(int) { } };
struct SS {
int m;
SS(int x) :m(x) { }
explicit operator S() { return S(m); }
// because S don't have S(SS)
};
SS ss(1);
S s1 = ss; // error; like an explicit constructor
S s2(ss); // ok ; like an explicit constructor
void f(S);
f(ss); // error; like an explicit constructor

09/10-Dec-13

Overview of C++11

112
User-Defined Literals


C++ provides literals for a variety of built-in types:

123 // int
1.2 // double
1.2F // float
'a' // char
1ULL // unsigned long long
0xD0 // hexadecimal unsigned
"as" // string



However, in C++03 there are no literals for user-defined
types.
This is a violation of the principle that user-defined types
should be supported as well as built-in types are.

09/10-Dec-13

Overview of C++11

113
User-Defined Literals


Commonly requested user-defined literals are:

"Hi!"s // string, not "zero-terminated array of char"
1.2i // imaginary
123.4567891234df // decimal floating point (IBM)
101010111000101b // binary
123s // seconds
123.56km // not miles! (units)
1234567890123456789012345678901234567890x
// extended-precision

09/10-Dec-13

Overview of C++11

114
User-Defined Literals


C++11 supports ''user-defined literals'' through the notion
of literal operators that map literals with a given suffix into a
desired type. For example:
constexpr
complex<double> operator "" i(long double d) // imaginary literal
{ return {0,d}; /* complex is a literal type */ }
std::string operator""s (const char* p, size_t n)
// std::string literal
{ return string(p,n); /* requires free store allocation */ }



Note the use of constexpr to enable compile-time evaluation.
Given those, we can write
template<class T> void f(const T&);
f("Hello"); // pass pointer to char*
f("Hello"s); // pass (5-character) string object
f("Hellon"s); // pass (6-character) string object
auto z = 2+1i; // complex(2,1)

09/10-Dec-13

Overview of C++11

115
User-Defined Literals
 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.

09/10-Dec-13

Overview of C++11

116
User-Defined 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:
Bignum operator"" x(const char* p)
{ return Bignum(p); }
void f(Bignum);
f(1234567890123456789012345678901234567890x);

 Here the C-style
string "12345678901234567890123456789012345
67890" is passed to operator"" x(). Note that we did
not explicitly put those digits into a string.
09/10-Dec-13

Overview of C++11

117
User-Defined Literals
 There are four kinds of literals that can be
suffixed to make a user-defined literal






integer literal: accepted by a literal operator taking a
single unsigned long long or const char* argument.
floating-point literal: accepted by a literal operator taking a
single long double or const char* argument.
string literal: accepted by a literal operator taking a pair
of (const char*, size_t) arguments.
character literal: accepted by a literal operator taking a
single char argument.

09/10-Dec-13

Overview of C++11

118
User-Defined Literals
 Note that you cannot make a literal operator
for a string literal that takes just a const
char* argument (and no size). For example:
string operator"" S(const char* p);
// warning: this will not work as expected
"one two"S;
// error: no applicable literal operator

 The rationale is that if we want to have ''a
different kind of string'' we almost always want
to know the number of characters anyway.
09/10-Dec-13

Overview of C++11

119
User-Defined Literals
 Suffixes will tend to be short (e.g. s for
string, i for imaginary, m for meter, and x for
extended), so different uses could easily clash.
Use namespaces to prevent clashes:
namespace Numerics {
// ...
class Bignum { /* ... */ };
namespace literals {
operator"" X(char const*);
}
}
using namespace Numerics::literals;
09/10-Dec-13

Overview of C++11

120
unions (generalized)


In C++98 (as in the earlier versions of C++), a member with a
user-defined constructor, destructor, or assignment cannot be
a member of a union:
union U {
int m1;
complex<double> m2; // error
string m3; // error
}

 In particular
U u; // which constructor, if any?
u.m1 = 1; // assign to int member
string s = u.m3; // disaster: read from string member



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

09/10-Dec-13

Overview of C++11

121
unions (generalized)
 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 errorprone 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.

09/10-Dec-13

Overview of C++11

122
unions (generalized)
 For example:
union U1 {
int m1;
complex<double> m2; // ok
};
union U2 {
int m1;
string m3; // ok
};



This may look error-prone, but the new restriction helps. In particular:
U1 u; // ok
u.m2 = {1,2}; // ok: assign to the complex member
U2 u2;
// error: the string destructor caused the U destructor to be deleted
U2 u3 = u2; // error: the string copy constructor caused the U copy
constructor to be deleted

09/10-Dec-13

Overview of C++11

123
unions (generalized)
 Basically, U2 is useless unless you embed it in a struct
that keeps track of which member (variant) is used. So,
build discriminate unions, such as:

09/10-Dec-13

Overview of C++11

124
unions (generalized)
class Widget { // Three alternative implementations represented as a union
private: enum class Tag { point, number, text } type; // discriminant
union { // representation
point p; // point has constructor
int i;
string s; // string has default ctor, copy operations, and dtor
}; // ...
widget& operator=(const widget& w) { // necessary for string variant
if (type==Tag::text && w.type==Tag::text) {
s = w.s; // usual string assignment
return *this;
}
if (type==Tag::text) s.~string(); // destroy (explicitly!)
switch (w.type) {
case Tag::point: p = w.p; break; // normal copy
case Tag::number: i = w.i; break;
case Tag::text: new(&s)(w.s); break; // placement new

}
type = w.type;
return *this;
}
09/10-Dec-13
};

Overview of C++11

125
References
1.
2.

3.
4.
5.
6.
7.

8.
9.

10.
11.

C++11 FAQ: http://www.stroustrup.com/C++11FAQ.html
Scott Meyers’ C++11 Materials: The Best Available Overview of C++11 by Herb Sutter, 2011:
http://herbsutter.com/2011/11/01/scott-meyerss-c11-materials-the-best-available-overviewof-c11/
C++11 STL additions: http://cpprocks.com/wp-content/uploads/c++11-stl-additions.pdf
C++11 Style – A Touch of Class by Bjarne Stroustrup, 2012:
http://ecn.channel9.msdn.com/events/GoingNative12/GN12Cpp11Style.pdf
N3376: Working Draft, Standard for Programming Language C++, 2012: http://www.openstd.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf
C++11 by Alex Sinyakov, 2013:
http://dl.dropboxusercontent.com/u/13100941/C%2B%2B11.pdf
N3631: C11: The New C Standard by Thomas Plum, 2013: http://www.openstd.org/jtc1/sc22/wg21/docs/papers/2013/n3631.pdf
Using C++11’s Smart Pointers by David Kieras, 2013:
http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
C++11 for Programmers (2nd Edition) by Paul J. Deitel, Harvey M. Deitel, 2013:
http://www.amazon.com/Programmers-Edition-Deitel-Developer-Series/dp/0133439852
Threads and Shared Variables in C++11 and elsewhere by Hans-J. Boehm, 2012:
http://www.hpl.hp.com/personal/Hans_Boehm/misc_slides/sfacm-cleaned.pdf
C++11 Threads Surprises by Hans-J. Boehm, 2012:
https://parasol.tamu.edu/bjarnefest/program/boehm-slides.pdf

09/10-Dec-13

Overview of C++11

126
References
12.

13.
14.
15.
16.

17.
18.
19.

20.
21.

Compiler Testing via a Theory of Sound Optimisations in the C11/C++11 Memory Model by
Robin Morisset, Pankaj Pawan & Francesco Zappa Nardelli, 2013:
http://www.di.ens.fr/~zappa/readings/pldi13.pdf
C11 and C++11 in FreeBSD by David Chisnall, 2013:
http://www.cl.cam.ac.uk/~dc552/papers/C11.pdf
C++11 Concurrency Tutorial by Anthony Williams, 2012:
http://www.justsoftwaresolutions.co.uk/files/c++11_concurrency.pdf
The C++11 Memory Model by Eran Gilad, 2012:
[](){}(); C++11 as a new language by Thiago Macieira, 2012:
http://cdn.oreillystatic.com/en/assets/1/event/80/C++11%20as%20a%20new%20language%
20Presentation.pdf
C++11 by Sasha Goldshtein, 2012:
http://www.slideshare.net/ppd19611/savedfiles?s_title=c11-12147261&user_login=goldshtn
The Style of C++ by Sasha Goldshtein, 2012: http://www.slideshare.net/goldshtn/the-styleof-c-11?utm_source=slideshow&utm_medium=ssemail&utm_campaign=download_notification
The Future of C++ by Sasha Goldshtein, 2012: http://www.slideshare.net/goldshtn/thefuture-ofc?utm_source=slideshow&utm_medium=ssemail&utm_campaign=download_notification
C++11 The Future is here by Bjarne Stroustrup, 2013:
http://www.infoq.com/presentations/Cplusplus-11-Bjarne-Stroustrup
Effective GoF Patterns with C++11 and Boost by Tobias Darm, 2013:
http://www.infoq.com/presentations/gof-patterns-c-plus-plus-boost

09/10-Dec-13

Overview of C++11

127
References
22.
23.

C++11 - the new ISO C++ standard by Bjarne Stroustrup, 2013:
http://www.stroustrup.com/C++11FAQ.html
C++11 - The new standard by Lars Kuhne, 2013: http://theinf2.informatik.unijena.de/theinf2_multimedia/Website_downloads/Lars/c__11.pdf

09/10-Dec-13

Overview of C++11

128
Thank You

Más contenido relacionado

La actualidad más candente

linux device driver
linux device driverlinux device driver
linux device driverRahul Batra
 
Linux kernel debugging
Linux kernel debuggingLinux kernel debugging
Linux kernel debuggingHao-Ran Liu
 
Part 02 Linux Kernel Module Programming
Part 02 Linux Kernel Module ProgrammingPart 02 Linux Kernel Module Programming
Part 02 Linux Kernel Module ProgrammingTushar B Kute
 
Character Array and String
Character Array and StringCharacter Array and String
Character Array and StringTasnima Hamid
 
Debugging linux kernel tools and techniques
Debugging linux kernel tools and  techniquesDebugging linux kernel tools and  techniques
Debugging linux kernel tools and techniquesSatpal Parmar
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device driversHoucheng Lin
 
Complete C++ programming Language Course
Complete C++ programming Language CourseComplete C++ programming Language Course
Complete C++ programming Language CourseVivek chan
 
Binary operator overloading
Binary operator overloadingBinary operator overloading
Binary operator overloadingBalajiGovindan5
 

La actualidad más candente (20)

linux device driver
linux device driverlinux device driver
linux device driver
 
C++11
C++11C++11
C++11
 
Linux kernel debugging
Linux kernel debuggingLinux kernel debugging
Linux kernel debugging
 
Part 02 Linux Kernel Module Programming
Part 02 Linux Kernel Module ProgrammingPart 02 Linux Kernel Module Programming
Part 02 Linux Kernel Module Programming
 
Intro to c++
Intro to c++Intro to c++
Intro to c++
 
C and C++ functions
C and C++ functionsC and C++ functions
C and C++ functions
 
Character Array and String
Character Array and StringCharacter Array and String
Character Array and String
 
Functions in c++
Functions in c++Functions in c++
Functions in c++
 
Debugging linux kernel tools and techniques
Debugging linux kernel tools and  techniquesDebugging linux kernel tools and  techniques
Debugging linux kernel tools and techniques
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device drivers
 
25 bnf
25 bnf25 bnf
25 bnf
 
Linux-Internals-and-Networking
Linux-Internals-and-NetworkingLinux-Internals-and-Networking
Linux-Internals-and-Networking
 
Embedded Android : System Development - Part III (Audio / Video HAL)
Embedded Android : System Development - Part III (Audio / Video HAL)Embedded Android : System Development - Part III (Audio / Video HAL)
Embedded Android : System Development - Part III (Audio / Video HAL)
 
Complete C++ programming Language Course
Complete C++ programming Language CourseComplete C++ programming Language Course
Complete C++ programming Language Course
 
Linux Systems: Getting started with setting up an Embedded platform
Linux Systems: Getting started with setting up an Embedded platformLinux Systems: Getting started with setting up an Embedded platform
Linux Systems: Getting started with setting up an Embedded platform
 
Modern C++
Modern C++Modern C++
Modern C++
 
Unix
UnixUnix
Unix
 
Binary operator overloading
Binary operator overloadingBinary operator overloading
Binary operator overloading
 
Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android : System Development - Part II (Linux device drivers)Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android : System Development - Part II (Linux device drivers)
 
Pointers in c++
Pointers in c++Pointers in c++
Pointers in c++
 

Destacado

C++11 smart pointers
C++11 smart pointersC++11 smart pointers
C++11 smart pointerschchwy Chang
 
Data Structure Midterm Lesson Arrays
Data Structure Midterm Lesson ArraysData Structure Midterm Lesson Arrays
Data Structure Midterm Lesson ArraysMaulen Bale
 
C++17 introduction - Meetup @EtixLabs
C++17 introduction - Meetup @EtixLabsC++17 introduction - Meetup @EtixLabs
C++17 introduction - Meetup @EtixLabsStephane Gleizes
 
Web I - 05 - HTTP Protocol
Web I - 05 - HTTP ProtocolWeb I - 05 - HTTP Protocol
Web I - 05 - HTTP ProtocolRandy Connolly
 
C++11 concurrency
C++11 concurrencyC++11 concurrency
C++11 concurrencyxu liwei
 
"Http protocol and other stuff" by Bipin Upadhyay
"Http protocol and other stuff" by Bipin Upadhyay"Http protocol and other stuff" by Bipin Upadhyay
"Http protocol and other stuff" by Bipin UpadhyayBipin Upadhyay
 
HTTP Protocol Basic
HTTP Protocol BasicHTTP Protocol Basic
HTTP Protocol BasicChuong Mai
 
C++17 - the upcoming revolution (Code::Dive 2015)/
C++17 - the upcoming revolution (Code::Dive 2015)/C++17 - the upcoming revolution (Code::Dive 2015)/
C++17 - the upcoming revolution (Code::Dive 2015)/Sławomir Zborowski
 
Trends and future of C++: Evolving a systems language for performance - by Bj...
Trends and future of C++: Evolving a systems language for performance - by Bj...Trends and future of C++: Evolving a systems language for performance - by Bj...
Trends and future of C++: Evolving a systems language for performance - by Bj...devstonez
 
Networking - TCP/IP stack introduction and IPv6
Networking - TCP/IP stack introduction and IPv6Networking - TCP/IP stack introduction and IPv6
Networking - TCP/IP stack introduction and IPv6Rodolfo Kohn
 
Elements of C++11
Elements of C++11Elements of C++11
Elements of C++11Uilian Ries
 
Database connectivity to sql server asp.net
Database connectivity to sql server asp.netDatabase connectivity to sql server asp.net
Database connectivity to sql server asp.netHemant Sankhla
 
C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012 C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012 Sumant Tambe
 
C++ 11 Style : A Touch of Class
C++ 11 Style : A Touch of ClassC++ 11 Style : A Touch of Class
C++ 11 Style : A Touch of ClassYogendra Rampuria
 
C# Tutorial MSM_Murach chapter-17-slides
C# Tutorial MSM_Murach chapter-17-slidesC# Tutorial MSM_Murach chapter-17-slides
C# Tutorial MSM_Murach chapter-17-slidesSami Mut
 
Cpp17 and Beyond
Cpp17 and BeyondCpp17 and Beyond
Cpp17 and BeyondComicSansMS
 

Destacado (20)

C++11 smart pointers
C++11 smart pointersC++11 smart pointers
C++11 smart pointers
 
Data Structure Midterm Lesson Arrays
Data Structure Midterm Lesson ArraysData Structure Midterm Lesson Arrays
Data Structure Midterm Lesson Arrays
 
C++17 introduction - Meetup @EtixLabs
C++17 introduction - Meetup @EtixLabsC++17 introduction - Meetup @EtixLabs
C++17 introduction - Meetup @EtixLabs
 
Web I - 05 - HTTP Protocol
Web I - 05 - HTTP ProtocolWeb I - 05 - HTTP Protocol
Web I - 05 - HTTP Protocol
 
TCP/IP
TCP/IPTCP/IP
TCP/IP
 
Bjarne essencegn13
Bjarne essencegn13Bjarne essencegn13
Bjarne essencegn13
 
C++11
C++11C++11
C++11
 
C++11 concurrency
C++11 concurrencyC++11 concurrency
C++11 concurrency
 
"Http protocol and other stuff" by Bipin Upadhyay
"Http protocol and other stuff" by Bipin Upadhyay"Http protocol and other stuff" by Bipin Upadhyay
"Http protocol and other stuff" by Bipin Upadhyay
 
HTTP Protocol Basic
HTTP Protocol BasicHTTP Protocol Basic
HTTP Protocol Basic
 
C++17 - the upcoming revolution (Code::Dive 2015)/
C++17 - the upcoming revolution (Code::Dive 2015)/C++17 - the upcoming revolution (Code::Dive 2015)/
C++17 - the upcoming revolution (Code::Dive 2015)/
 
Trends and future of C++: Evolving a systems language for performance - by Bj...
Trends and future of C++: Evolving a systems language for performance - by Bj...Trends and future of C++: Evolving a systems language for performance - by Bj...
Trends and future of C++: Evolving a systems language for performance - by Bj...
 
Networking - TCP/IP stack introduction and IPv6
Networking - TCP/IP stack introduction and IPv6Networking - TCP/IP stack introduction and IPv6
Networking - TCP/IP stack introduction and IPv6
 
Elements of C++11
Elements of C++11Elements of C++11
Elements of C++11
 
Database connectivity to sql server asp.net
Database connectivity to sql server asp.netDatabase connectivity to sql server asp.net
Database connectivity to sql server asp.net
 
C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012 C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
C++ 11 Style : A Touch of Class
C++ 11 Style : A Touch of ClassC++ 11 Style : A Touch of Class
C++ 11 Style : A Touch of Class
 
C# Tutorial MSM_Murach chapter-17-slides
C# Tutorial MSM_Murach chapter-17-slidesC# Tutorial MSM_Murach chapter-17-slides
C# Tutorial MSM_Murach chapter-17-slides
 
Cpp17 and Beyond
Cpp17 and BeyondCpp17 and Beyond
Cpp17 and Beyond
 

Similar a C++11

C programming session 01
C programming session 01C programming session 01
C programming session 01Dushmanta Nath
 
Introduction to c
Introduction to cIntroduction to c
Introduction to camol_chavan
 
Report on c and c++
Report on c and c++Report on c and c++
Report on c and c++oggyrao
 
Learning C++ - Introduction to c++ programming 1
Learning C++ - Introduction to c++ programming 1Learning C++ - Introduction to c++ programming 1
Learning C++ - Introduction to c++ programming 1Ali Aminian
 
C Programming ppt for beginners . Introduction
C Programming ppt for beginners . IntroductionC Programming ppt for beginners . Introduction
C Programming ppt for beginners . Introductionraghukatagall2
 
Programming in C Basics
Programming in C BasicsProgramming in C Basics
Programming in C BasicsBharat Kalia
 
(8) cpp abstractions separated_compilation_and_binding_part_i
(8) cpp abstractions separated_compilation_and_binding_part_i(8) cpp abstractions separated_compilation_and_binding_part_i
(8) cpp abstractions separated_compilation_and_binding_part_iNico Ludwig
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointJavaTpoint.Com
 
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...ANUSUYA S
 
Glimpses of C++0x
Glimpses of C++0xGlimpses of C++0x
Glimpses of C++0xppd1961
 
basics of C and c++ by eteaching
basics of C and c++ by eteachingbasics of C and c++ by eteaching
basics of C and c++ by eteachingeteaching
 

Similar a C++11 (20)

C programming session 01
C programming session 01C programming session 01
C programming session 01
 
Introduction to c
Introduction to cIntroduction to c
Introduction to c
 
Report on c and c++
Report on c and c++Report on c and c++
Report on c and c++
 
Learning C++ - Introduction to c++ programming 1
Learning C++ - Introduction to c++ programming 1Learning C++ - Introduction to c++ programming 1
Learning C++ - Introduction to c++ programming 1
 
C Programming ppt for beginners . Introduction
C Programming ppt for beginners . IntroductionC Programming ppt for beginners . Introduction
C Programming ppt for beginners . Introduction
 
Advanced+pointers
Advanced+pointersAdvanced+pointers
Advanced+pointers
 
Chap 2 c++
Chap 2 c++Chap 2 c++
Chap 2 c++
 
c.ppt
c.pptc.ppt
c.ppt
 
Cbasic
CbasicCbasic
Cbasic
 
Programming in C Basics
Programming in C BasicsProgramming in C Basics
Programming in C Basics
 
(8) cpp abstractions separated_compilation_and_binding_part_i
(8) cpp abstractions separated_compilation_and_binding_part_i(8) cpp abstractions separated_compilation_and_binding_part_i
(8) cpp abstractions separated_compilation_and_binding_part_i
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpoint
 
L6
L6L6
L6
 
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
 
Glimpses of C++0x
Glimpses of C++0xGlimpses of C++0x
Glimpses of C++0x
 
Csdfsadf
CsdfsadfCsdfsadf
Csdfsadf
 
C
CC
C
 
C
CC
C
 
basics of C and c++ by eteaching
basics of C and c++ by eteachingbasics of C and c++ by eteaching
basics of C and c++ by eteaching
 
Theory1&amp;2
Theory1&amp;2Theory1&amp;2
Theory1&amp;2
 

Más de ppd1961

Land of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel Tour
Land of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel TourLand of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel Tour
Land of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel Tourppd1961
 
Science & Culture Article with Editorial & Cover
Science & Culture Article with Editorial & CoverScience & Culture Article with Editorial & Cover
Science & Culture Article with Editorial & Coverppd1961
 
NDL @ YOJANA
NDL @ YOJANANDL @ YOJANA
NDL @ YOJANAppd1961
 
Unified Modeling Language (UML)
Unified Modeling Language (UML)Unified Modeling Language (UML)
Unified Modeling Language (UML)ppd1961
 
OOP in C++
OOP in C++OOP in C++
OOP in C++ppd1961
 
Digital geometry - An introduction
Digital geometry  - An introductionDigital geometry  - An introduction
Digital geometry - An introductionppd1961
 
Innovation in technology
Innovation in technologyInnovation in technology
Innovation in technologyppd1961
 
Kinectic vision looking deep into depth
Kinectic vision   looking deep into depthKinectic vision   looking deep into depth
Kinectic vision looking deep into depthppd1961
 
Function Call Optimization
Function Call OptimizationFunction Call Optimization
Function Call Optimizationppd1961
 
How To Define An Integer Constant In C
How To Define An Integer Constant In CHow To Define An Integer Constant In C
How To Define An Integer Constant In Cppd1961
 
Stl Containers
Stl ContainersStl Containers
Stl Containersppd1961
 
Object Lifetime In C C++
Object Lifetime In C C++Object Lifetime In C C++
Object Lifetime In C C++ppd1961
 
Technical Documentation By Techies
Technical Documentation By TechiesTechnical Documentation By Techies
Technical Documentation By Techiesppd1961
 
Vlsi Education In India
Vlsi Education In IndiaVlsi Education In India
Vlsi Education In Indiappd1961
 
Reconfigurable Computing
Reconfigurable ComputingReconfigurable Computing
Reconfigurable Computingppd1961
 
Women In Engineering Panel Discussion
Women In Engineering   Panel DiscussionWomen In Engineering   Panel Discussion
Women In Engineering Panel Discussionppd1961
 
Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2ppd1961
 
Handling Exceptions In C &amp; C++[Part A]
Handling Exceptions In C &amp; C++[Part A]Handling Exceptions In C &amp; C++[Part A]
Handling Exceptions In C &amp; C++[Part A]ppd1961
 
Dimensions of Offshore Technology Services
Dimensions of Offshore Technology ServicesDimensions of Offshore Technology Services
Dimensions of Offshore Technology Servicesppd1961
 
Concepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming LanguagesConcepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming Languagesppd1961
 

Más de ppd1961 (20)

Land of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel Tour
Land of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel TourLand of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel Tour
Land of Pyramids, Petra, and Prayers - Egypt, Jordan, and Israel Tour
 
Science & Culture Article with Editorial & Cover
Science & Culture Article with Editorial & CoverScience & Culture Article with Editorial & Cover
Science & Culture Article with Editorial & Cover
 
NDL @ YOJANA
NDL @ YOJANANDL @ YOJANA
NDL @ YOJANA
 
Unified Modeling Language (UML)
Unified Modeling Language (UML)Unified Modeling Language (UML)
Unified Modeling Language (UML)
 
OOP in C++
OOP in C++OOP in C++
OOP in C++
 
Digital geometry - An introduction
Digital geometry  - An introductionDigital geometry  - An introduction
Digital geometry - An introduction
 
Innovation in technology
Innovation in technologyInnovation in technology
Innovation in technology
 
Kinectic vision looking deep into depth
Kinectic vision   looking deep into depthKinectic vision   looking deep into depth
Kinectic vision looking deep into depth
 
Function Call Optimization
Function Call OptimizationFunction Call Optimization
Function Call Optimization
 
How To Define An Integer Constant In C
How To Define An Integer Constant In CHow To Define An Integer Constant In C
How To Define An Integer Constant In C
 
Stl Containers
Stl ContainersStl Containers
Stl Containers
 
Object Lifetime In C C++
Object Lifetime In C C++Object Lifetime In C C++
Object Lifetime In C C++
 
Technical Documentation By Techies
Technical Documentation By TechiesTechnical Documentation By Techies
Technical Documentation By Techies
 
Vlsi Education In India
Vlsi Education In IndiaVlsi Education In India
Vlsi Education In India
 
Reconfigurable Computing
Reconfigurable ComputingReconfigurable Computing
Reconfigurable Computing
 
Women In Engineering Panel Discussion
Women In Engineering   Panel DiscussionWomen In Engineering   Panel Discussion
Women In Engineering Panel Discussion
 
Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2
 
Handling Exceptions In C &amp; C++[Part A]
Handling Exceptions In C &amp; C++[Part A]Handling Exceptions In C &amp; C++[Part A]
Handling Exceptions In C &amp; C++[Part A]
 
Dimensions of Offshore Technology Services
Dimensions of Offshore Technology ServicesDimensions of Offshore Technology Services
Dimensions of Offshore Technology Services
 
Concepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming LanguagesConcepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming Languages
 

Último

Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 

Último (20)

Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 

C++11

  • 1. Welcome to New C++ Standard C++11 Dr. Partha Pratim Das 09/10-Dec-13 Overview of C++11 1
  • 2. History of C++  1998: ISO C++ Standard officially adopted (“C++98”). 776 pages.  2003: TC1 (“Technical Corrigendum 1”) published (“C++03”). Bug fixes for C++98.  2005: TR1 (Library “Technical Report 1”) published. 14 likely new components for the standard library.  2009: Selected “C++0x” features became commonly available.  2011: C++0x ratified ⇒ “C++11”. 1353 pages.  2013: Full C++14 draft adopted. 1374 pages.  2014: Revised C++ Standard (minor).  2017?: Revised C++ Standard (major). 09/10-Dec-13 Overview of C++11 2
  • 3. Source:  Codes presented here have been shamelessly lifted from: C++11 FAQ by Bjarne Stroustrup: http://www.stroustrup.com/C++11FAQ.html  However, the presenter has taken the liberty to inject bugs at several places while creating his own examples.  A list of other sources (sparingly used) are given at the end. 09/10-Dec-13 Overview of C++11 3
  • 4. Features (Day 1)         Standard Types & long long nullptr -- a null pointer literal enum class -- scoped and strongly typed enums constexpr -- generalized and guaranteed constant expressions Static (compile-time) assertions -- static_assert auto -- deduction of a type from an initializer decltype -- the type of an expression Suffix return type syntax 09/10-Dec-13           Initializer lists Range-for statement Uniform initialization syntax and semantics Preventing narrowing Delegating constructors In-class member initializers Inherited constructors Rvalue references control of defaults: default and delete control of defaults: move and copy Overview of C++11 4
  • 5. Features (Day 2)            Override controls: override Override controls: final “>>” as Nested Template Closer template alias (formerly known as "template typedef") Variadic Templates Raw string literals Lambdas noexcept -- preventing exception propagation Explicit conversion operators User-defined literals unions (generalized) 09/10-Dec-13 Overview of C++11 5
  • 6. Features (Not covered)             PODs (generalized) Attributes Local types as template arguments alignment C99 features Extended integer types Dynamic Initialization and Destruction with Concurrency thread-local storage (thread_local) Unicode characters Copying and rethrowing exceptions Extern templates Inline namespace 09/10-Dec-13  And many more … Overview of C++11 6
  • 7. Standard Integer Types C++03 C++11  sizeof(int) == ?          sizeof(char) ==  1 byte (? bits)     sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 09/10-Dec-13 int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t Overview of C++11 7
  • 8. Standard Integer Types C++03 C++11  Fast Types  Fast Types     int_fast8_t int_fast16_t int_fast32_t int_fast64_t  Least Types     int_least8_t int_least16_t int_least32_t int_least64_t  intmax_t  intptr_t 09/10-Dec-13     uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t  Least Types     uint_least8_t uint_least16_t uint_least32_t uint_least64_t  uintmax_t  uintptr_t Overview of C++11 8
  • 9. Standard Integer Types  What is the difference between the int types int8_t, int_least8_t and int_fast8_t?  Suppose you have a C compiler for a 36-bit system, with char = 9 bits, short = 18 bits, int = 36 bits, and long = 72 bits. Then    int8_t does not exist, because there is no way to satisfy the constraint of having exactly 8 value bits with no padding. int_least8_t is a typedef of char. NOT of short or int, because the standard requires the smallest type with at least 8 bits. int_fast8_t can be anything. It's likely to be a typedef of int if the "native" size is considered to be "fast". 09/10-Dec-13 Overview of C++11 9
  • 10. long long – a longer integer  An integer that's at least 64 bits long. For example: long long x = 9223372036854775807LL;  No, there are no long long longs nor can long be spelled short long long. 09/10-Dec-13 Overview of C++11 10
  • 11. nullptr C++03 C++11 void foo(char*) { cout << "char*" << endl; } void foo(char*) { cout << "char*" << endl; } void foo(int) { cout << "int" << endl; } void foo(int) { cout << "int" << endl; } foo(NULL); foo(nullptr); int char * 09/10-Dec-13 Overview of C++11 11
  • 12. enum class – scoped and strongly typed enums  The enum classes ("new enums", "strong enums") address three problems with traditional C++ enumerations:    conventional enums implicitly convert to int, causing errors when someone does not want an enumeration to act as an integer. conventional enums export their enumerators to the surrounding scope, causing name clashes. the underlying type of an enum cannot be specified, causing confusion, compatibility problems, and makes forward declaration impossible.  enum classes ("strong enums") are strongly typed and scoped: 09/10-Dec-13 Overview of C++11 12
  • 13. enum class – scoped and strongly typed enums C++03 C++11 enum Alert {green,yellow,red}; enum Color {red,blue}; // error C2365: 'red' : redefinition; previous definition was 'enumerator' Alert a=7; // error C2440: 'initializing' : cannot convert from 'int' to 'main::Alert' int a2=red; // ok: Alert->int conversion int a3=Alert::red; // warning C4482: nonstandard extension used: enum 'main::Alert' used in qualified name enum class Alert {green,yellow,red}; enum class Color:int {red,blue}; Alert a=7; // error: cannot convert 'int' to 'main()::Alert' in initialization Color c=7; // error: cannot convert 'int' to 'main()::Color' in initialization int a2=red; // error: 'red' was not declared in this scope int a3=Alert::red; // error: cannot convert 'main()::Alert' to 'int' in initialization int a4=Color::blue; // error: cannot convert 'main()::Color' to 'int' in initialization Color a5=Color::blue; // ok 09/10-Dec-13 Overview of C++11 13
  • 14. enum class – scoped and strongly typed enums  Being able to specify the underlying type allow simpler interoperability and guaranteed sizes of enumerations:     enum class Color : char { red, blue }; // compact representation enum class TrafficLight { red, yellow, green }; // by default, the underlying type is int enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; // how big is an E? "implementation defined" enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; // now we can be specific 09/10-Dec-13 Overview of C++11 14
  • 15. enum class – scoped and strongly typed enums  It also enables forward declaration of enums: enum class Color_code : char; // forward declaration void foobar(Color_code* p); // use of forward // declaration // ... enum class Color_code : char { red, yellow, green, blue }; // definition  The underlying type must be one of the signed or unsigned integer types; the default is int. 09/10-Dec-13 Overview of C++11 15
  • 16. enum class – scoped and strongly typed enums  In the standard library, enum classes are used  For mapping systems specific error codes: enum class errc;  For pointer safety indicators: enum class pointer_safety { relaxed, preferred, strict };  For I/O stream errors: enum class io_errc { stream = 1 };  For asynchronous communications error handling: enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied }; 09/10-Dec-13 Overview of C++11 16
  • 17. constexpr – generalized and guaranteed constant expressions  The constexpr mechanism  provides more general constant expressions  allows constant expressions involving userdefined types  provides a way to guarantee that an initialization is done at compile time 09/10-Dec-13 Overview of C++11 17
  • 18. constexpr – generalized and guaranteed constant expressions  Consider enum Flags { good=0, fail=1, bad=2, eof=4 }; constexpr int operator|(Flags f1, Flags f2) { return Flags(int(f1)|int(f2)); } void f(Flags x) { switch (x) { case bad: /* ... */ break; case eof: /* ... */ break; case bad|eof: /* ... */ break; default: /* ... */ break; } }  In constexpr the function must be of a simple form so that it can be evaluated at compile time if given constant expressions arguments. 09/10-Dec-13 Overview of C++11 18
  • 19. constexpr – generalized and guaranteed constant expressions C++03 C++11 template<int N> struct Fib { enum { value = Fib<N-1>::value + Fib<N-2>::value }; }; template<> struct Fib<1> { enum { value=1 }; }; template<> struct Fib<0>{ enum { value=0 }; }; constexpr int Fib(int n) { return n<2? n: Fib(n-1)+Fib(n-2); } cout<<Fib(10)<<endl; // Compile-time int a=10; cout<<Fib(a)<<endl; // Run-time cout<<Fib<10>::value<<endl; // Cannot be used at run-time 09/10-Dec-13 Overview of C++11 19
  • 20. constexpr – generalized and guaranteed constant expressions  This also works for objects for which the constructors are simple enough to be constexpr and expressions involving such objects: struct Point { int x,y; constexpr Point(int xx, int yy): x(xx), y(yy) { } }; constexpr Point origo(0,0); constexpr int z = origo.x; constexpr Point a[] = { Point(0,0), Point(1,1), Point(2,2) }; constexpr int x = a[1].x; // x becomes 1 09/10-Dec-13 Overview of C++11 20
  • 21. constexpr – generalized and guaranteed constant expressions  constexpr & const are not replacements of each other const constexpr The object is not modified through an interface (however the object may be modified through other interfaces). What can be computed at compile time, making such computations type safe. const objects provide excellent optimization opportunities for the compiler. Objects declared constexpr have their initializer evaluated at compile time. If the address of a const object isn't taken the compiler may evaluate its initializer at compile time and keep that object in its tables rather than emitting it into the generated code. These are values kept in the compiler's tables and only emitted into the generated code if needed. 09/10-Dec-13 Overview of C++11 21
  • 22. static_assert  C++11 template<class T> void f(T v) { static_assert(sizeof(v) == 4, "v must have size of 4 bytes"); //do something with v } void g() { double v; // 8 bytes f(v); } error C2338: v must have size of 4 bytes 09/10-Dec-13 Overview of C++11 22
  • 23. static_assert  Another example: struct S { X m1; Y m2; }; static_assert( sizeof(S)==sizeof(X)+sizeof(Y),"unexpected padding in S");  static_assert works at compile-time and not with runtime values (use assert or test-and-throw) int f(int* p, int n) { static_assert(p==0,"p is not null"); // error: static_assert() expression not a constant expression // ... } 09/10-Dec-13 Overview of C++11 23
  • 24. auto How good is: auto x = GetX(); ? C++03 C++11 map<string,string> m; map<string,string>::iterator it = m.begin(); map<string,string> m; auto it = m.begin(); double const param = config["param"]; auto const param = config["param"]; singleton& s = singleton::instance(); auto &s = singleton::instance(); T *p=new T(); auto p = new T(); 09/10-Dec-13 Overview of C++11 24
  • 25. auto template<class T> void printall(const vector<T>& v) { for(auto p=v.begin(); p!=v.end(); ++p) cout << *p << "n"; } is better than template<class T> void printall(const vector<T>& v) { for (typename vector<T>::const_iterator p=v.begin(); p!=v.end(); ++p) cout << *p << "n"; } When the type of a variable depends critically on template argument it can be really hard to write code without auto. For example: template<class T, class U> void multiply(const vector<T>& vt, const vector<U>& vu) { // ... auto tmp = vt[i]*vu[i]; // ... } 09/10-Dec-13 Overview of C++11 25
  • 26. • decltype • decltype is an operator for querying the type of an expression. Similar to the sizeof operator, the operand of decltype is unevaluated. C++03 C++11 int i=4; const int j=6; const int &k=i; int a[5]; int* p; int var1; int var2; int var3; int& var4=i; const int var5=1; const int& var6=j; int var7[5]; int& var8=i; int& var9=i; int i=4; const int j=6; const int &k=i; int a[5]; int* p; decltype(i) var1; decltype(1) var2; decltype(2+3) var3; decltype(i=1) var4=i;//no assignment decltype(j) var5=1; decltype(k) var6=j; decltype(a) var7; decltype(a[3]) var8=i; decltype(*p) var9=i; 09/10-Dec-13 Overview of C++11 26
  • 27. decltype  decltype(E) is the type ("declared type") of the name or expression E and can be used in declarations: void f(const vector<int>& a, vector<float>& b) { typedef decltype(a[0]*b[0]) Tmp; for (int i=0; i<b.size(); ++i) { Tmp* p = new Tmp(a[i]*b[i]); // ... } // ... }  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. 09/10-Dec-13 Overview of C++11 27
  • 28. Suffix Return Type Syntax  Consider: template<class T, class U> ??? mul(T x, U y) { return x*y; }  How to write the return type? It's "the type of x*y" – but how can we say that? First idea, use decltype: template<class T, class U> decltype(x*y) mul(T x, U y) // scope problem! { return x*y; }  That won't work because x and y are not in scope. So: template<class T, class U> decltype(*(T*)(0)**(U*)(0)) mul(T x, U y) // ugly! and error prone { return x*y; } 09/10-Dec-13 Overview of C++11 28
  • 29. Suffix Return Type Syntax  Put the return type where it belongs, after the arguments: template<class T, class U> auto mul(T x, U y) -> decltype(x*y) { return x*y; }  We use the notation auto to mean "return type to be deduced or specified later." 09/10-Dec-13 Overview of C++11 29
  • 30. Suffix Return Type Syntax  The suffix syntax is not primarily about templates and type deduction, it is really about scope. struct List { struct Link { /* ... */ }; Link* erase(Link* p); // remove p and return // the link before p // ... }; List::Link* List::erase(Link* p) { /* ... */ }  The first List:: is necessary only because the scope of List isn't entered until the second List::. Better: auto List::erase(Link* p) -> Link* { /* ... */ }  Now neither Link needs explicit qualification. 09/10-Dec-13 Overview of C++11 30
  • 31. Initializer Lists  Consider (doesn’t work in C++03) vector<double> v = { 1, 2, 3.456, 99.99 }; list<pair<string,string>> languages = { {"Nygaard","Simula"}, {"Richards","BCPL"}, {"Ritchie","C"} }; map<vector<string>,vector<int>> years = { { {"Maurice","Vincent", "Wilkes"},{1913, 1945, 1951, 1967, 2000} }, { {"Martin", "Ritchards"}, {1982, 2003, 2007} }, { {"David", "John", "Wheeler"}, {1927, 1947, 1951, 2004} } }; 09/10-Dec-13 Overview of C++11 31
  • 32. Initializer Lists  Initializer lists are not just for arrays any more.  The mechanism for accepting a {}-list is a function (often a constructor) accepting an argument of type std::initializer_list<T>. For example: void f(initializer_list<int>); f({1,2}); f({23,345,4567,56789}); f({}); // the empty list f{1,2}; // error: function call ( ) missing years.insert({{"Bjarne","Stroustrup"},{1950, 1975, 1985}});  The initializer list can be of arbitrary length, but must be homogeneous (all elements must be of a the template argument type, T, or convertible to T). 09/10-Dec-13 Overview of C++11 32
  • 33. Initializer Lists  A container implements an initializer-list constructor as: vector<int> v = {1,2,3,4,5}; // Following ctor is called template<class E> class vector { public: vector (std::initializer_list<E> s) { // initializer-list constructor reserve(s.size()); // get the right amount of space uninitialized_copy(s.begin(), s.end(), elem); // initialize elements (in elem[0:s.size()]) sz = s.size(); // set vector size } // ... as before ... }; 09/10-Dec-13 Overview of C++11 33
  • 34. Initializer Lists  Alternatively, vector<int>v={1,2,3,4,5}; template<class T> class vector{ vector(initializer_list<T> args) {/* rude, naïve implementation */ for(auto it=begin(args); it!=end(args); ++it) push_back(*it); } //… }; 09/10-Dec-13 Overview of C++11 34
  • 35. Initializer Lists  initializer_list<T>is a light weight proxy object that provides access to an array of objects of type T.  A std::initializer_list object is automatically constructed when: vector<int> v{1,2,3,4,5}; // list-initialization v={1,2,3,4,5}; // assignment expression f({1,2,3,4,5}); // function call for(int x:{1,2,3}) //ranged for loop cout<<x<<endl; 09/10-Dec-13 Overview of C++11 35
  • 36. Initializer Lists  The distinction between direct initialization and copy initialization is maintained for {}-initialization  For example, std::vector has an explicit constructor from int and an initializer-list constructor: vector<double> v1(7); // ok: v1 has 7 elements v1 = 9; // error: no conversion from int to vector vector<double> v2 = 9; // error: no conversion from int to vector void f(const vector<double>&); f(9); // error: no conversion from int to vector 09/10-Dec-13 Overview of C++11 36
  • 37. Initializer Lists  With initializer-list constructor: vector<double> v1{7}; // ok: v1 has 1 element (with its value 7.0) v1 = {9}; // ok v1 now has 1 element (with its value 9.0) vector<double> v2 = {9}; // ok: v2 has 1 element (with its value 9.0) f({9}); // ok: f is called with the list { 9 } vector<vector<double>> vs = { vector<double>(10), // ok: (10 elements) vector<double>{10}, // ok: (1 element with value 10.0) 10 // error: vector's constructor is explicit }; 09/10-Dec-13 Overview of C++11 37
  • 38. Initializer Lists  Consider: structT{ T(int,int); T(initializer_list<int>); }; T foo{10,20}; // calls initializer_list ctor T bar(10,20); // calls first constructor  Initializer-list constructors take precedence over other constructors when the initializer-list constructor syntax is used! 09/10-Dec-13 Overview of C++11 38
  • 39. Initializer Lists  The function can access the initializer_list as an immutable sequence. For example: void f(initializer_list<int> args) { for (auto p=args.begin(); p!=args.end(); ++p) cout << *p << "n"; }  A constructor that takes a single argument of type std::initializer_list is called an initializer-list constructor.  The standard library containers, string, and regex have initializer-list constructors, assignment, etc.  An initializer-list can be used as a range, e.g. in a range for statement  The initializer lists are part of the scheme for uniform and general initialization. 09/10-Dec-13 Overview of C++11 39
  • 40. Range – for, begin, end C++03 C++11 for(i = 10; i >= 0; --i) { v.push_back(i); } for(vector<int>::iterator i = v.begin(); i!=v.end(); ++i) cout << *i << " "; cout << endl; for(i = 10; i >= 0; --i) { v.push_back(i); } for(auto d:v) cout << d << " "; sort(v.begin(),v.end()); sort(v.begin(),v.end()); for(vector<int>::iterator i = v.begin();i!=v.end();++i) cout << *i << " "; cout << endl; for(auto d:v) cout << d << " "; 09/10-Dec-13 cout << endl; cout << endl; Overview of C++11 40
  • 41. Range – for, begin, end    A range-for statement is to iterate through a 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 begin() & end() are defined void f(vector<double>& v) { for (auto x : v) cout << x << 'n'; // A reference to allow change of value for (auto& x : v) ++x; } for (const auto x : { 1,2,3,5,8,13,21,34 }) cout << x << 'n'; The begin() (and end()) can be member x.begin() or a freestanding function to be called begin(x). 09/10-Dec-13 Overview of C++11 41
  • 42. Uniform Initialization Syntax and Semantics  C++ offers several ways of initializing an object depending on its type and the initialization context. When misused, the error can be surprising and the error messages obscure. Consider: string a[] = { "foo", " bar" }; // ok: initialize array variable vector<string> v = { "foo", " bar" }; // error: initializer list for non-aggregate vector void f(string a[]); f( { "foo", " bar" } ); // syntax error: block as argument 09/10-Dec-13 Overview of C++11 42
  • 43. Uniform Initialization Syntax and Semantics  and int a = 2; // "assignment style" int aa[] = { 2, 3 }; // assignment style with list complex z(1,2); // "functional style" initialization x = Ptr(y); // "functional style" for // conversion / cast / construction  and int a(1); // variable definition int b(); // function declaration int b(foo); // variable definition or // function declaration  It can be hard to remember the rules for initialization and to choose the best way. 09/10-Dec-13 Overview of C++11 43
  • 44. Uniform Initialization Syntax and Semantics  The C++11 solution is to allow {}-initializer lists for all initialization: struct X { int x; int y; }; X x1 = X{1,2}; X x2 = {1,2}; // the = is optional X x3{1,2}; X* p = new X{1,2}; struct D: X { D(int x, int y): X{x, y} { /* ... */ }; }; struct S { int a[3]; S(int x, int y, int z): a{x, y, z} { /* ... */ }; }; 09/10-Dec-13 Overview of C++11 44
  • 45. Uniform Initialization Syntax and Semantics  Importantly, X{a} constructs the same value in every context, so that {}-initialization gives the same result in all places where it is legal. For example: X x{a}; X* p = new X{a}; z = X{a}; // use as cast f({a}); // function argument (of type X) return {a}; // function return value (function returning X) 09/10-Dec-13 Overview of C++11 45
  • 46. Uniform Initialization Syntax and Semantics C++03 C++11 int a[]={1,2,3,4,5}; vector<int> v; for(int i=1;i<=5;++i) v.push_back(i); int a[]={1,2,3,4,5}; vector<int> v={1,2,3,4,5}; map<int,string> labels; labels.insert(make_pair(1,“Open”)); labels.insert(make_pair(2,“Close”)); labels.insert(make_pair(3,“Reboot”)); map<int,string> labels{ {1,"Open"}, {2,"Close"}, {3,"Reboot"}}; Vector3 normalize(const Vector3& v){ float inv_len=1.f/length(v); return Vector3(v.x*inv_len, v.y*inv_len, v.z*inv_len); } Vector3 normalize(const Vector3& v){ float inv_len=1.f/length(v); return {v.x*inv_len, v.y*inv_len, v.z*inv_len}; } Vector3 x=normalize(Vector3(2,5,9)); Vector3 y(4,2,1); Vector3 x=normalize({2,5,9}); Vector3 y{4,2,1}; 09/10-Dec-13 Overview of C++11 46
  • 47. Uniform Initialization Syntax and Semantics C++03 C++11 struct B{ B(){} }; struct B{ B(){} }; struct A{ A(B){} void f(){} }; struct A{ A(B){} void f(){} }; int main(){ A a(B()); // function declaration! int main(){ A a{B()}; // calls B ctor,then A ctor a.f();//compile error! a.f(); // calls A::f return 0; return 0; } } 09/10-Dec-13 Overview of C++11 47
  • 48. Prevent Narrowing  The problem: C and C++ implicitly truncates: int x = 7.3; // Ouch! void f(int); f(7.3); // Ouch!  However, in C++11, {} initialization doesn't narrow: int x0 {7.3}; // error: narrowing int x1 = {7.3}; // error: narrowing double d = 7; int x2{d}; // error: narrowing (double to int) char x3{7}; // ok: 7 is an int, yet this is not narrowing vector<int> vi = { 1, 2.3, 4, 5.6 }; // error: double to int narrowing 09/10-Dec-13 Overview of C++11 48
  • 49. Prevent Narrowing  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: char c1{7}; // OK: 7 is an int, but it fits in a char char c2{77777}; // error: narrowing (assuming 8-bit chars)  Note that floating-point to integer conversions are always considered narrowing -- even 7.0 to 7. 09/10-Dec-13 Overview of C++11 49
  • 50. Delegating Constructor C++03 C++11 class A { int a; void validate(int x) { if (0<x && x<=42) a=x; else cout << "Fail " << x; } public: A(int x) {validate(x);} A() {validate(42);} A(string s) { int x = atoi(s.c_str()); validate(x); } }; class A { int a; public: A(int x) { if (0<x && x<=42) a=x; else cout << "Fail " << x; } A():A{42}{} A(string s): A{atoi(s.c_str())}{} }; 09/10-Dec-13 Overview of C++11 50
  • 51. In-class Member Initializers  In C++03, 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: int var = 7; class X { static const int m1 = 7; // ok const int m2 = 7; // error: not static static int m3 = 7; // error: not const static const int m4 = var; // error: initializer not constant expression static const string m5 = "odd"; // error: not integral type // ... }; 09/10-Dec-13 Overview of C++11 51
  • 52. In-class Member Initializers  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) {} }; 09/10-Dec-13 Overview of C++11 52
  • 53. In-class Member Initializers C++03 C++11 class A { public: A(): a(4), b(2), h("text1"), s("text2") {} private: int a; int b; string h; string s; }; class A { public: A(){} private: int a=4; int b=2; string h="text1"; string s="text2"; }; 09/10-Dec-13 Overview of C++11 53
  • 54. In-class Member Initializers class A { public: A(): a(7), b(5), hash_algorithm("MD5"), s("Constructor run") {} A(int a_val): a(a_val), b(5), hash_algorithm("MD5"), s("Constructor run") {} A(D d): a(7), b(g(d)), hash_algorithm("MD5"), s("Constructor run") {} int a, b; private: HashingFunction hash_algorithm; // Cryptographic hash // for all instances std::string s; // String indicating state // in object lifecycle }; 09/10-Dec-13 Overview of C++11 54
  • 55. In-class Member Initializers class A { public: A(): a(7), b(5) {} A(int a_val): a(a_val), b(5) {} A(D d): a(7), b(g(d)) {} int a, b; private: HashingFunction hash_algorithm{"MD5"}; // Cryptographic hash // for all instances std::string s{"Constructor run"}; // String indicating state // in object lifecycle }; 09/10-Dec-13 Overview of C++11 55
  • 56. In-class Member Initializers class A { public: A() {} A(int a_val): a(a_val) {} A(D d): b(g(d)) {} int a = 7; int b = 5; private: HashingFunction hash_algorithm{"MD5"}; // Cryptographic hash // for all instances std::string s{"Constructor run"}; // String indicating state // in object lifecycle }; 09/10-Dec-13 Overview of C++11 56
  • 57. Inherited Constructors  A member of a base class is not in the same scope as a member of a derived class: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // fine D d; d.f(4.5); // surprise: calls f(int) with argument 4  "lift" a set of overloaded functions (excluding ctors) from a base class into a derived class: struct B { void f(double); }; struct D : B { using B::f; // bring all f()s from B into scope void f(int); // add a new f() }; B b; b.f(4.5); // fine D d; d.f(4.5); // fine: calls D::f(double) which is B::f(double) 09/10-Dec-13 Overview of C++11 57
  • 58. Inherited Constructors  C++11 provides the facility to ‘lift’ constructors: class Derived : public Base { public: using Base::f; // lift Base's f into Derived's scope // -- works in C++03 void f(char); // provide a new f void f(int); // prefer this f to Base::f(int) using Base::Base; // lift Base constructors into // Derived's scope -- C++11 only Derived(char); // provide a new constructor Derived(int); // prefer this constructor to Base::Base(int) // ... }; 09/10-Dec-13 Overview of C++11 58
  • 59. Inherited Constructors  Caveat – inheriting constructors in a derived class in which you define new member variables needing initialization: struct B1 { B1(int) { } }; struct D1 : B1 { using B1::B1; // implicitly declares D1(int) int x; }; void test() { D1 d(6); // Oops: d.x is not initialized D1 e; // error: D1 has no default constructor } 09/10-Dec-13 Overview of C++11 59
  • 60. Inherited Constructors  Fix by in-class initialization: struct D1 : B1 { using B1::B1; // implicitly declares D1(int) int x{0}; // note: x is initialized }; void test() { D1 d(6); // d.x is zero } 09/10-Dec-13 Overview of C++11 60
  • 61. Rvalue References  In the context of: int lval = 5; // an lvalue 5; // an rvalue int f() { return 0; }  Non-const references can bind to lvalues int& ref_lval = lval; // ok  And const references can bind to lvalues or rvalues const int& const_ref_lval = lval; // ok const int& const_ref_rval = 5; // ok const int& const_ref_rval = f(); // ok  But there is nothing that can bind to a non-const rvalue. int& ref_rval = 5; // cannot convert from 'int' to 'int &‘ int& ref_rval = f(); // cannot convert from 'int' to 'int &' 09/10-Dec-13 Overview of C++11 61
  • 62. Rvalue References  This is to protect people from changing the values of temporaries that are destroyed before their new value can be used. void incr(int& a) { ++a; } int i = 0; incr(i); // i becomes 1 incr(0); // error: 0 in not an lvalue  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. 09/10-Dec-13 Overview of C++11 62
  • 63. Rvalue References   An rvalue reference binds to an rvalue (but not to an lvalue). The && indicates an "rvalue reference". int&& ref_rval = 5; int&& ref_rval = lval; // cannot convert from // 'int' to 'int &&‘ – // bind is an lvalue int&& ref_rval = lval+5; int&& ref_rval = f();  In simple terms, an rvalue reference can be set to an expression whose address cannot be taken: &5; &(lval+5); &f() // error: requires an lvalue &lval // ok: has an address 09/10-Dec-13 Overview of C++11 63
  • 64. Rvalue References  Why are we doing all this? 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). We do not need copies at all. We just wanted to move the values of a, b, and tmp around a bit.  09/10-Dec-13 Overview of C++11 64
  • 65. Rvalue References  C++11 defines "move constructors" and "move assignments" to move rather than copy their argument: template<class T> class vector { // ... vector(const vector&); // copy constructor vector(vector&&); // move constructor vector& operator=(const vector&); // copy assignment vector& operator=(vector&&); // move assignment }; // note: move constructor and // move assignment takes non-const && // they can, and usually do, write to their argument 09/10-Dec-13 Overview of C++11 65
  • 66. Rvalue References  move assignment 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). 09/10-Dec-13 Overview of C++11 66
  • 67. Rvalue References  How do we know whether it's ok to simply move from a source? We tell the compiler: template<class T> void swap(T& a, T& b) { // "perfect swap" (almost) T tmp = move(a); // could invalidate a a = move(b); // could invalidate b b = move(tmp); // could invalidate tmp }   move(x) means "you can treat x as an rvalue". In C++11 move() template function uses rvalue references. template <class T> typename remove_reference<T>::type&& move(T&& a) { return a; } 09/10-Dec-13 Overview of C++11 67
  • 68. Control of defaults: default and delete  “Prohibiting copying” idiom: class X { // ... X& operator=(const X&) = delete; // Disallow copy X(const X&) = delete; };  Conversely, we can explicitly ask for default copy behavior: class Y { // ... Y& operator=(const Y&) = default; // default copy Y(const Y&) = default; }; 09/10-Dec-13 Overview of C++11 68
  • 69. Control of defaults: default and delete  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 }; 09/10-Dec-13 Overview of C++11 69
  • 70. 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; consider all and explicitly define or default or delete the ones you want. Copying, moving, and destruction are closely related operations, rather than being individual operations that you can freely mix and match. Only a few combinations make sense semantically. If any move, copy, or destructor is explicitly specified (declared, defined, =default, or =delete) by the user:   no move is generated by default. any undeclared copy operations are generated by default, but this is deprecated, so don't rely on that. 09/10-Dec-13 Overview of C++11 70
  • 71. Control of defaults: move and copy Move / Copy / Destructor Specs Implicit Implication class X1 { X1& operator=(const X1&) = delete; // Disallow copying }; Disallows moving of X1s. Copy initialization is allowed, but deprecated. class X2 { X2& operator=(const X2&) = default; }; Disallows moving of X2s. Copy initialization is allowed, but deprecated. class X3 { X3& operator=(X3&&) = delete; // Disallow moving }; Disallows copying of X3s. class X4 { ~X4() = delete; // Disallow destruction }; Disallows moving of X4s. Copying is allowed, but deprecated. 09/10-Dec-13 Overview of C++11 71
  • 72. Control of defaults: move and copy  Example: No move. No Copy template<class T> class Handle { T* p; public: Handle(T* pp): p{pp} {} ~Handle() { delete p; } // user-defined destructor: no implicit copy or move Handle(Handle&& h) = delete; // no move Handle& operator=(Handle&& h) = delete; // no move Handle(const Handle&) = delete; // no copy Handle& operator=(const Handle&) = delete; // no copy void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; } }; 09/10-Dec-13 Overview of C++11 72
  • 73. Control of defaults: move and copy  Example: No Move. Only Copy template<class T> class Handle { T* p; public: Handle(T* pp): p{pp} {} ~Handle() { delete p; } // user-defined destructor: no implicit copy or move Handle(Handle&& h) = delete; // no move Handle& operator=(Handle&& h) = delete; // no move Handle(const Handle& h): p{h.p} {}; // copy ownership Handle& operator=(const Handle& h) { delete p; p=h.p; return *this; } // copy ownership void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; } }; 09/10-Dec-13 Overview of C++11 73
  • 74. Control of defaults: move and copy  Example: Move and No Copy template<class T> class Handle { T* p; public: Handle(T* pp): p{pp} {} ~Handle() { delete p; } // user-defined destructor: no implicit copy or move Handle(Handle&& h): p{h.p} { h.p=nullptr; }; // transfer ownership Handle& operator=(Handle&& h) { delete p; p=h.p; h.p=nullptr; return *this; } // transfer ownership Handle(const Handle& h) = delete; // no copy Handle& operator=(const Handle& h) = delete; // no copy void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; } }; 09/10-Dec-13 Overview of C++11 74
  • 75. Control of defaults: move and copy  Example: Move and Copy template<class T> class Handle { T* p; public: Handle(T* pp): p{pp} {} ~Handle() { delete p; } // user-defined destructor: no implicit copy or move Handle(Handle&& h): p{h.p} { h.p=nullptr; }; // transfer ownership Handle& operator=(Handle&& h) { delete p; p=h.p; h.p=nullptr; return *this; } // transfer ownership Handle(const Handle& h): p{h.p} {}; // copy ownership Handle& operator=(const Handle& h) { delete p; p=h.p; return *this; } // copy ownership void Print() { if (p) cout << *p << endl; else cout << "NULL" << endl; } }; 09/10-Dec-13 Overview of C++11 75
  • 76. Control of defaults: move and copy  Example: Move and Copy Version int *p = new int(5); cout << "Raw: " << *p << endl; Handle<int> h1(p); cout << "h1: "; h1.Print(); Raw h1: h2: h1: h3: h2: Handle<int> h2{move(h1)}; cout << "h2: "; h2.Print(); cout << "h1: "; h1.Print(); Handle<int> h3{h2}; cout << "h3: "; h3.Print(); cout << "h2: "; h2.Print(); 09/10-Dec-13 Overview of C++11 = 5 5 5 NULL 5 5 76
  • 77. override  Consider the overriding rules: struct B { virtual void virtual void virtual void void k(); // }; struct D : B { void f(); // void g(); // // virtual void // void k(); // // // }; 09/10-Dec-13 f(); g() const; h(char); not virtual    overrides B::f() doesn't override B::g(): wrong type h(char); overrides B::h() doesn't override B::k() - B::k() is not virtual Did the programmer mean to override B::g()? (almost certainly yes). Did the programming mean to override B::h(char)? (probably not because of the redundant explicit virtual). Did the programmer mean to override B::k()? (probably, but that's not possible). Overview of C++11 77
  • 78. override  To allow the programmer to be more explicit about overriding, we now have the "contextual keyword" override: struct D : B { void f() override; // void g() override; // virtual void h(char); void k() override; // };   OK: overrides B::f() error: wrong type // overrides B::h(); likely warning error: B::k() is not virtual 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: int override = 7; // not recommended 09/10-Dec-13 Overview of C++11 78
  • 79. override C++03 C++11 struct Base { virtual void f(float) { cout << "Base::fn"; } }; struct Derived:Base { virtual void f(float) { cout << "Derived::fn"; } //warning }; Derived myD; Base *p = &myD; p->f(2); Derived::f struct Base { virtual void f(float) { cout << "Base::fn"; } }; struct Derived:Base { void f(float) override { cout << "Derived::fn"; } }; Derived myD; Base *p = &myD; p->f(2); Derived::f 09/10-Dec-13 Overview of C++11 79
  • 80. override C++03 C++11 struct Base { virtual void f(float) { cout << "Base::fn"; } }; struct Derived:Base { virtual void f(int) { cout << "Derived::fn"; } //warning }; Derived myD; Base *p = &myD; p->f(2); Base::f struct Base { virtual void f(float) { cout << "Base::fn"; } }; struct Derived:Base { void f(float) override { cout << "Derived::fn"; } }; Derived myD; Base *p = &myD; p->f(2); Derived::f 09/10-Dec-13 Overview of C++11 80
  • 81. override C++03 C++11 struct Base { virtual void f(float) { cout << "Base::fn"; } }; struct Derived:Base { virtual void f(int) { cout << "Derived::fn"; } //warning }; Derived myD; Base *p = &myD; p->f(2); Base::f struct Base { virtual void f(float) { cout << "Base::fn"; } }; struct Derived:Base { void f(int) override { cout << "Derived::fn"; } }; 09/10-Dec-13 'Derived::f' : method with override specifier 'override' did not override any base class methods Overview of C++11 81
  • 82. override controls: final – preventing inheritance C++03 C++03 class Base { public: Base(){} }; class Derived: public Base {}; class Base { public: static Base *Instance() { return new Base; } private: Base() {}; }; class Derived: public Base {}; Base b; // Ok Derived d; // Ok Inheritance cannot be prevented; instantiation of objects of inherited class can be prevented. 09/10-Dec-13 Base b; // Error Base *pb = Base::Instance(); Derived d; // Error Overview of C++11 82
  • 83. override controls: final – preventing inheritance C++03 C++03 class Base { public: virtual void f(); }; class Derived: public Base { public: void f(); }; class BaseX { public: BaseX() {}; virtual void f(); }; class DerivedX: public BaseX { public: DerivedX() {}; private: void f() { cout << "DerivedXn"; }; }; class MoreDerivedX: public DerivedX { }; It is not easy to stop inheritance of virtual member functions. Also, errors cannot come from class compilation. 09/10-Dec-13 MoreDerivedX mdx; mdx.f(); // Error Overview of C++11 83
  • 84. override controls: final – preventing inheritance C++03 C++11 struct Base1{}; struct Derived1: public Base1 { }; struct Base1 final {}; struct Derived1: public Base1 { // Error }; struct Base2 { virtual void f(); }; struct Derived2: public Base2 { void f(); }; 09/10-Dec-13 struct Base2 { virtual void f() final; }; struct Derived2: public Base2 { void f(); // Error }; Overview of C++11 84
  • 85. override controls: final – preventing inheritance Java C++11 final class Base1{} class Derived1 extends Base1{ //error } struct Base1 final {}; struct Derived1: public Base1 { // Error }; class Base2{ public final void f(){}; } class Derived2 extends Base2{ public void f(){};//error } struct Base2 { virtual void f() final; }; struct Derived2: public Base2 { void f(); // Error }; 09/10-Dec-13 Overview of C++11 85
  • 86. “>>” as Nested Template Closer  Consider list<vector<string>> lvs;   In C++03 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) 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. 09/10-Dec-13 Overview of C++11 86
  • 87. “>>” as Nested Template Closer C++03 C++11 std::vector<std::list<int>> vi1; // Error std::vector<std::list<int>> vi1; // Ok std::vector<std::list<int> > vi2; // Ok std::vector<std::list<int> > vi2; // Ok const int n = … ; // n, m are const int m = … ; // constants const int n = … ; // n, m are const int m = … ; // constants std::list<std::array<int, n>>2 >> L1; // error: 2 shifts std::list<std::array<int, n>>2 >> L1; // error: 1st “>>” closes // both templates std::list<std::array<int, (n>>2) >> L2; // error: 2 shifts std::list<std::array<int, (n>>2) >> L2; // Ok 09/10-Dec-13 Overview of C++11 87
  • 88. Template Alias (aka Template Typedef) template<class T> using Vec = std::vector<T,My_alloc<T>>; // standard vector using my allocator Vec<int> fib = { 1, 2, 3, 5, 8, 13 }; // allocates elements using My_alloc vector<int,My_alloc<int>> verbose = fib; // verbose and fib are of the same type   The keyword using is used to get a linear notation "name followed by what it refers to." Cannot use typedef for the same purpose 09/10-Dec-13 Overview of C++11 88
  • 89. Template Alias (aka Template Typedef)  Specialization works (you can alias a set of specializations but you cannot specialize an alias): template<int> // idea: int_exact_trait<N>::type is a type with exactly N bits struct int_exact_traits { typedef int type; }; template<> struct int_exact_traits<8> { typedef char type; }; template<> struct int_exact_traits<16> { typedef char[2] type; }; // ... template<int N> using int_exact = typename int_exact_traits<N>::type; // define alias for convenient notation int_exact<8> a = 7; // int_exact<8> is an int with 8 bits 09/10-Dec-13 Overview of C++11 89
  • 90. Template Alias (aka Template Typedef)  Type aliases can also be used as a different syntax for ordinary type aliases: typedef void (*PFD)(double); // C style using PF = void (*)(double); // using plus C-style type using P = [](double)->void; // using plus suffix return type 09/10-Dec-13 Overview of C++11 90
  • 91. Variadic Templates  Type-safe printf(): const string pi = "pi"; const char* m = "The value of %s is about %g (unless you live in %s).n"; printf(m, pi, 3.14159, "Indiana"); 09/10-Dec-13 Overview of C++11 91
  • 92. Variadic Templates  The simplest case of printf() is when there are no arguments except the format string: void printf(const char* s) { while (s && *s) { // make sure that there wasn't meant to be more // arguments %% represents plain % in a format string if (*s=='%' && *++s!='%') throw runtime_error( "invalid format: missing arguments"); std::cout << *s++; } } 09/10-Dec-13 Overview of C++11 92
  • 93. Variadic Templates  Next we handle printf() with more arguments: template<typename T, typename... Args> // note "..." void printf(const char* s, T value, Args... args) { // note "..." while (s && *s) { if (*s=='%' && *++s!='%') { // a format specifier // (ignore which one it is) std::cout << value; printf(++s, args...); // use first non-format argument // "peel off" first argument return; // Code on the site is wrong! } std::cout << *s++; } throw std::runtime error("extra arguments provided to printf"); } 09/10-Dec-13 Overview of C++11 93
  • 94. Variadic Templates  This code simply ''peels off'' the first nonformat argument and then calls itself recursively.  When there are no more non-format arguments, it calls the first (simpler) printf() (above).  Functional programming done at compile time.  Note how the overloading of << replaces the use of the (possibly erroneous) ''hint'' in the format specifier. 09/10-Dec-13 Overview of C++11 94
  • 95. Variadic Templates    Args... is a ''parameter pack'' – a sequence of (type / value) pairs to ''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. Continues till args is empty when the first printf() is called. 09/10-Dec-13 Overview of C++11 95
  • 96. Variadic Templates  We build a variadic type: // Helper type traits template<typename T> struct template<typename T> struct template<typename T> struct template<typename T> struct { typedef T const &type; }; add_reference { typedef T &type; }; add_reference<T&> { typedef T &type; }; add_const_reference { typedef T const &type; }; add_const_reference<T&> template<typename... Values> class myTuple; // Basis case: zero-length tuple template<> class myTuple<> {}; 09/10-Dec-13 Overview of C++11 96
  • 97. Variadic Templates template<typename Head, typename... Tail> class myTuple<Head, Tail...>: private myTuple<Tail...> { typedef myTuple<Tail...> inherited; public: myTuple() {} myTuple(typename add_const_reference<Head>::type v, typename add_const_reference<Tail>::type... vtail) // Construct from arguments. : m_head(v), inherited(vtail...) {} template<typename... VValues>// Construct tuple from another tuple. myTuple(const myTuple<VValues...>& other) : m_head(other.head()), inherited(other.tail()) {} template<typename... VValues>// Copy Assignment myTuple& operator=(const myTuple<VValues...>& other) { m_head = other.head(); tail() = other.tail(); return *this; } typename add_reference<Head>::type head() { return m_head; } typename add_reference<const Head>::type head() const { return m_head; } inherited& tail() { return *this; } const inherited& tail() const { return *this; } protected: Head m_head; }; 09/10-Dec-13 Overview of C++11 97
  • 98. Variadic Templates void test_tuple() { myTuple<> t0a; myTuple<> t0b(t0a); t0a = t0b; myTuple<int> t1a; myTuple<int> t1b(17); myTuple<int> t1c(t1b); t1a = t1b; myTuple<float> t1d(3.14159); myTuple<float> t1e(t1d); t1d = t1e; myTuple<vector<int>,string,int> tt({1,2,3},"hello",5); string h = tt.tail().head(); // "hello" myTuple<string,int> t2 = tt.tail(); // {,"hello",5}; } 09/10-Dec-13 Overview of C++11 98
  • 99. Raw String Literals    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 (ww): string s = "ww"; // 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"(ww)"; // I'm pretty sure I got that right 09/10-Dec-13 Overview of C++11 99
  • 100. Raw String Literals C++03 C++11 string test="C:ABCDfile1.txt"; cout<<test<<endl; string test=R"(C:ABCDfile1.txt)"; cout<<test<<endl; C:ABCDfile1.txt C:ABCDfile1.txt string test; test="FirstLine.nSecondline.nThirdLine.n"; cout<<test<<endl; string test; test=R"(FirstLine.nSecondline.nThirdLine.n)"; cout<<test<<endl; FirstLine. Secondline. ThirdLine. FirstLine.nSecondline.nThirdLine.n string test= R"(FirstLine. Secondline. ThirdLine.)"; cout<<test<<endl; FirstLine. Secondline. ThirdLine. 09/10-Dec-13 Overview of C++11 100
  • 101. lambdas   A lambda expression specifies a function object. The primary use for a lambda is to specify a simple action to be performed by some function. For example: vector<int> v = {50, -10, 20, -30}; std::sort(v.begin(), v.end()); // the default sort // now v should be { -30, -10, 20, 50 } // sort by absolute value: std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a)<abs(b); }); // now v should be { -10, 20, -30, 50 }  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. 09/10-Dec-13 Overview of C++11 101
  • 102. lambdas  A lambda expression can access local variables in the scope in which it is used. For example: void f(vector<Record>& v) { vector<int> indices(v.size()); int count = 0; generate(indices.begin(),indices.end(), [&count](){ return count++; }); // sort indices in the order determined // by the name field of the records: std::sort(indices.begin(), indices.end(), [&](int a, int b) { return v[a].name<v[b].name; }); // ... } 09/10-Dec-13 Overview of C++11 102
  • 103. lambdas Ram struct Record { string name; }; Shyam void f(vector<Record>& v) { Jadu vector<int> indices(v.size()); Madhu for(auto i:indices) cout << i << " "; cout << endl; 0 0 0 0 int count = 0; 0 1 2 3 generate(indices.begin(),indices.end(), 2 3 0 1 [&count](){ return count++; }); for(auto i:indices) cout << i << " "; cout << endl; // sort indices in the order of the name field of the records: std::sort(indices.begin(), indices.end(), [&](int a, int b) { return v[a].name<v[b].name; }); for(auto i:indices) cout << i << " "; cout << endl; } vector<Record> nameRecs = {{"Ram"}, {"Shyam"}, {"Jadu"}, {"Madhu"}}; for(auto m:nameRecs) cout << m.name << endl; f(nameRecs); 09/10-Dec-13 Overview of C++11 103
  • 104. lambdas  Using named function object: void f(vector<Record>& v) { vector<int> indices(v.size()); int count = 0; generate(indices.begin(),indices.end(), [&](){ return ++count; }); struct Cmp_names { const vector<Record>& vr; Cmp_names(const vector<Record>& r) :vr(r) { } bool operator()(int a, int b) const { return vr[a].name<vr[b].name; } }; // sort indices in the order of the name field of the records: std::sort(indices.begin(), indices.end(), Cmp_names(v)); } 09/10-Dec-13 Overview of C++11 104
  • 105. lambdas  To specify a lambda we must provide  its capture list: the list of variables it can use (in addition to its arguments):     Capture nothing is [] Capture all by references is [&] (can specify specific variables), and Capture all by value is [=] (can specify specific variables). (optionally) its arguments and their types (int a, int b)  The action to be performed as a block { 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. 09/10-Dec-13 Overview of C++11 105
  • 106. noexcept – preventing exception propagation  If a function cannot throw an exception or  If the program isn't written to handle exceptions thrown by a function, that function can be declared noexcept. extern "C" double sqrt(double) noexcept; // will never throw vector<double> my_computation(const vector<double>& v) noexcept { // Not prepared to handle memory exhaustion vector<double> res(v.size()); // might throw for(int i; i<v.size(); ++i) res[i] = sqrt(v[i]); return res; }  If a function declared noexcept throws, the program is terminated (by a call to terminate()).  The call of terminate() cannot rely on objects being in well-defined states 09/10-Dec-13 Overview of C++11 106
  • 107. noexcept – preventing exception propagation  noexcept is different from nothrow that guarantees not to throw.  It is possible 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: template<class T> void do_f(vector<T>& v) noexcept(noexcept(f(v.at(0)))) // can throw if f(v.at(0)) can { for(int i; i<v.size(); ++i) v.at(i) = f(v.at(i)); } 09/10-Dec-13 Overview of C++11 107
  • 108. noexcept – preventing exception propagation  Here, noexcept is first used 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.  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. 09/10-Dec-13 Overview of C++11 108
  • 109. noexcept – preventing exception propagation  A destructor shouldn't throw; a generated destructor is implicitly noexcept.  It is typically a bad idea to have a move operation throw, so declare those noexcept wherever possible.  noexcept is widely and systematically used in the standard library to improve performance and clarify requirements. 09/10-Dec-13 Overview of C++11 109
  • 110. Explicit Conversion Operators  C++03 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: struct S { S(int); }; // "ordinary constructor" defines implicit conversion S s1(1); // ok S s2 = 1; // ok void f(S); f(1); // ok (but that's often a bad surprise - what if S was vector?) struct E { explicit E(int); }; // explicit constructor E e1(1); // ok E e2 = 1; // error (but that's often a surprise) void f(E); f(1); // error (protects against surprises -- e.g. std::vector's constructor from int is explicit) 09/10-Dec-13 Overview of C++11 110
  • 111. Explicit Conversion Operators  However, a constructor is not the only mechanism for defining a conversion. If we can't modify a class, we can define a conversion operator from a different class. For example: struct S { S(int) { } /* ... */ }; struct SS { int m; SS(int x) :m(x) { } operator S() { return S(m); } // because S don't have S(SS); non-intrusive }; SS ss(1); S s1 = ss; // ok; like an implicit constructor S s2(ss); // ok ; like an implicit constructor void f(S); f(ss); // ok; like an implicit constructor 09/10-Dec-13 Overview of C++11 111
  • 112. Explicit Conversion Operators  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: struct S { S(int) { } }; struct SS { int m; SS(int x) :m(x) { } explicit operator S() { return S(m); } // because S don't have S(SS) }; SS ss(1); S s1 = ss; // error; like an explicit constructor S s2(ss); // ok ; like an explicit constructor void f(S); f(ss); // error; like an explicit constructor 09/10-Dec-13 Overview of C++11 112
  • 113. User-Defined Literals  C++ provides literals for a variety of built-in types: 123 // int 1.2 // double 1.2F // float 'a' // char 1ULL // unsigned long long 0xD0 // hexadecimal unsigned "as" // string   However, in C++03 there are no literals for user-defined types. This is a violation of the principle that user-defined types should be supported as well as built-in types are. 09/10-Dec-13 Overview of C++11 113
  • 114. User-Defined Literals  Commonly requested user-defined literals are: "Hi!"s // string, not "zero-terminated array of char" 1.2i // imaginary 123.4567891234df // decimal floating point (IBM) 101010111000101b // binary 123s // seconds 123.56km // not miles! (units) 1234567890123456789012345678901234567890x // extended-precision 09/10-Dec-13 Overview of C++11 114
  • 115. User-Defined Literals  C++11 supports ''user-defined literals'' through the notion of literal operators that map literals with a given suffix into a desired type. For example: constexpr complex<double> operator "" i(long double d) // imaginary literal { return {0,d}; /* complex is a literal type */ } std::string operator""s (const char* p, size_t n) // std::string literal { return string(p,n); /* requires free store allocation */ }  Note the use of constexpr to enable compile-time evaluation. Given those, we can write template<class T> void f(const T&); f("Hello"); // pass pointer to char* f("Hello"s); // pass (5-character) string object f("Hellon"s); // pass (6-character) string object auto z = 2+1i; // complex(2,1) 09/10-Dec-13 Overview of C++11 115
  • 116. User-Defined Literals  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. 09/10-Dec-13 Overview of C++11 116
  • 117. User-Defined 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: Bignum operator"" x(const char* p) { return Bignum(p); } void f(Bignum); f(1234567890123456789012345678901234567890x);  Here the C-style string "12345678901234567890123456789012345 67890" is passed to operator"" x(). Note that we did not explicitly put those digits into a string. 09/10-Dec-13 Overview of C++11 117
  • 118. User-Defined Literals  There are four kinds of literals that can be suffixed to make a user-defined literal     integer literal: accepted by a literal operator taking a single unsigned long long or const char* argument. floating-point literal: accepted by a literal operator taking a single long double or const char* argument. string literal: accepted by a literal operator taking a pair of (const char*, size_t) arguments. character literal: accepted by a literal operator taking a single char argument. 09/10-Dec-13 Overview of C++11 118
  • 119. User-Defined Literals  Note that you cannot make a literal operator for a string literal that takes just a const char* argument (and no size). For example: string operator"" S(const char* p); // warning: this will not work as expected "one two"S; // error: no applicable literal operator  The rationale is that if we want to have ''a different kind of string'' we almost always want to know the number of characters anyway. 09/10-Dec-13 Overview of C++11 119
  • 120. User-Defined Literals  Suffixes will tend to be short (e.g. s for string, i for imaginary, m for meter, and x for extended), so different uses could easily clash. Use namespaces to prevent clashes: namespace Numerics { // ... class Bignum { /* ... */ }; namespace literals { operator"" X(char const*); } } using namespace Numerics::literals; 09/10-Dec-13 Overview of C++11 120
  • 121. unions (generalized)  In C++98 (as in the earlier versions of C++), a member with a user-defined constructor, destructor, or assignment cannot be a member of a union: union U { int m1; complex<double> m2; // error string m3; // error }  In particular U u; // which constructor, if any? u.m1 = 1; // assign to int member string s = u.m3; // disaster: read from string member  Obviously, it's illegal to write one member and then read another but people do that nevertheless (usually by mistake). 09/10-Dec-13 Overview of C++11 121
  • 122. unions (generalized)  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 errorprone 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. 09/10-Dec-13 Overview of C++11 122
  • 123. unions (generalized)  For example: union U1 { int m1; complex<double> m2; // ok }; union U2 { int m1; string m3; // ok };  This may look error-prone, but the new restriction helps. In particular: U1 u; // ok u.m2 = {1,2}; // ok: assign to the complex member U2 u2; // error: the string destructor caused the U destructor to be deleted U2 u3 = u2; // error: the string copy constructor caused the U copy constructor to be deleted 09/10-Dec-13 Overview of C++11 123
  • 124. unions (generalized)  Basically, U2 is useless unless you embed it in a struct that keeps track of which member (variant) is used. So, build discriminate unions, such as: 09/10-Dec-13 Overview of C++11 124
  • 125. unions (generalized) class Widget { // Three alternative implementations represented as a union private: enum class Tag { point, number, text } type; // discriminant union { // representation point p; // point has constructor int i; string s; // string has default ctor, copy operations, and dtor }; // ... widget& operator=(const widget& w) { // necessary for string variant if (type==Tag::text && w.type==Tag::text) { s = w.s; // usual string assignment return *this; } if (type==Tag::text) s.~string(); // destroy (explicitly!) switch (w.type) { case Tag::point: p = w.p; break; // normal copy case Tag::number: i = w.i; break; case Tag::text: new(&s)(w.s); break; // placement new } type = w.type; return *this; } 09/10-Dec-13 }; Overview of C++11 125
  • 126. References 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. C++11 FAQ: http://www.stroustrup.com/C++11FAQ.html Scott Meyers’ C++11 Materials: The Best Available Overview of C++11 by Herb Sutter, 2011: http://herbsutter.com/2011/11/01/scott-meyerss-c11-materials-the-best-available-overviewof-c11/ C++11 STL additions: http://cpprocks.com/wp-content/uploads/c++11-stl-additions.pdf C++11 Style – A Touch of Class by Bjarne Stroustrup, 2012: http://ecn.channel9.msdn.com/events/GoingNative12/GN12Cpp11Style.pdf N3376: Working Draft, Standard for Programming Language C++, 2012: http://www.openstd.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf C++11 by Alex Sinyakov, 2013: http://dl.dropboxusercontent.com/u/13100941/C%2B%2B11.pdf N3631: C11: The New C Standard by Thomas Plum, 2013: http://www.openstd.org/jtc1/sc22/wg21/docs/papers/2013/n3631.pdf Using C++11’s Smart Pointers by David Kieras, 2013: http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf C++11 for Programmers (2nd Edition) by Paul J. Deitel, Harvey M. Deitel, 2013: http://www.amazon.com/Programmers-Edition-Deitel-Developer-Series/dp/0133439852 Threads and Shared Variables in C++11 and elsewhere by Hans-J. Boehm, 2012: http://www.hpl.hp.com/personal/Hans_Boehm/misc_slides/sfacm-cleaned.pdf C++11 Threads Surprises by Hans-J. Boehm, 2012: https://parasol.tamu.edu/bjarnefest/program/boehm-slides.pdf 09/10-Dec-13 Overview of C++11 126
  • 127. References 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Compiler Testing via a Theory of Sound Optimisations in the C11/C++11 Memory Model by Robin Morisset, Pankaj Pawan & Francesco Zappa Nardelli, 2013: http://www.di.ens.fr/~zappa/readings/pldi13.pdf C11 and C++11 in FreeBSD by David Chisnall, 2013: http://www.cl.cam.ac.uk/~dc552/papers/C11.pdf C++11 Concurrency Tutorial by Anthony Williams, 2012: http://www.justsoftwaresolutions.co.uk/files/c++11_concurrency.pdf The C++11 Memory Model by Eran Gilad, 2012: [](){}(); C++11 as a new language by Thiago Macieira, 2012: http://cdn.oreillystatic.com/en/assets/1/event/80/C++11%20as%20a%20new%20language% 20Presentation.pdf C++11 by Sasha Goldshtein, 2012: http://www.slideshare.net/ppd19611/savedfiles?s_title=c11-12147261&user_login=goldshtn The Style of C++ by Sasha Goldshtein, 2012: http://www.slideshare.net/goldshtn/the-styleof-c-11?utm_source=slideshow&utm_medium=ssemail&utm_campaign=download_notification The Future of C++ by Sasha Goldshtein, 2012: http://www.slideshare.net/goldshtn/thefuture-ofc?utm_source=slideshow&utm_medium=ssemail&utm_campaign=download_notification C++11 The Future is here by Bjarne Stroustrup, 2013: http://www.infoq.com/presentations/Cplusplus-11-Bjarne-Stroustrup Effective GoF Patterns with C++11 and Boost by Tobias Darm, 2013: http://www.infoq.com/presentations/gof-patterns-c-plus-plus-boost 09/10-Dec-13 Overview of C++11 127
  • 128. References 22. 23. C++11 - the new ISO C++ standard by Bjarne Stroustrup, 2013: http://www.stroustrup.com/C++11FAQ.html C++11 - The new standard by Lars Kuhne, 2013: http://theinf2.informatik.unijena.de/theinf2_multimedia/Website_downloads/Lars/c__11.pdf 09/10-Dec-13 Overview of C++11 128