c++11 (formerly known as c++0x) is the new c++ language standard. dave abrahams, boostpro computing

Post on 10-May-2015

12.817 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Dave Abrahams, BoostPro ComputingHe is a founding member of Boost.org and an active participant in the ISO C++ standards committee. His broad range of experience in the computer industry includes shrink-wrap software development, embedded systems design and natural language processing. He has authored eight Boost libraries and has made contributions to numerous others. Dave made his mark on C++ standardization by developing a conceptual framework for understanding exception-safety and applying it to the C++ standard library. He created the first exception-safe standard library implementation and, with Greg Colvin, drafted the proposals that eventually became the standard library’s exception safety guarantees.Presentation topic:C++11 (formerly known as C++0x) is the new C++ language standard. Dave Abrahams, BoostPro Computing.Key points:The ISO C++ standardization committee has just unanimously approved its final draft international standard, and it's chock full of new features. Though a few of the features have been available for years, some are brand new, and nobody really knows what it's like to program in this new C++ language. As with C++03, Boost.org is expected to take a leading role in exploiting C++11. In this talk, I'll give an overview of the most important new developments.

TRANSCRIPT

C++ 2011Highlights from the New International Standard

1

Monday, September 19, 2011

Intro

• Who am I

• Who are you?

• Why We’re Here

2

Monday, September 19, 2011

C++11 Goals

• Make C++ a better language for systems

programming

• Make C++ a better language for writing libraries

• Make C++ more teachable and learnable

• Maintain backward compatibility

3

Monday, September 19, 2011

C++11 At a Glance

• General Core Language Features

concurrency, move semantics, auto, range-based for, lambdas…

• Library Features

containers, regular expressions, smart pointers, new algorithms…

• Features for writing classes

constructor delegation, override/final, =default/=delete…

• Crazy Template Stuff

Variadic templates, template aliases, decltype, perfect forwarding, …

4

Monday, September 19, 2011

Ponies for Everybody!Big wins from little features

5

Monday, September 19, 2011

Type Deduction

6

void print_3x(vector<float> const& v){ for ( vector<float>::const_iterator p = v.begin(); p != v.end(); p++ ) { std::cout << *p * 3 << " "; }}

Monday, September 19, 2011

Type Deduction

6

void print_3x(vector<float> const& v){ for ( vector<float>::const_iterator p = v.begin(); p != v.end(); p++ ) { std::cout << *p * 3 << " "; }}

Monday, September 19, 2011

Type Deduction

7

void print_3x(vector<float> const& v){ for ( auto p = v.begin(); p != v.end(); p++ ) { std::cout << *p * 3 << " "; }}

Monday, September 19, 2011

Type Deduction

8

void print_3x(vector<float> const& v){ for ( auto p = v.begin(); p != v.end(); p++ ) { std::cout << *p * 3 << " "; }}

Monday, September 19, 2011

Type Deduction

9

auto a = 3; intconst auto b = 3.14; const doubleauto const& c = 42; int const&

auto d = "foobar"; char const*auto& e = "baz" char const(&)[4]

extern std::list<Foo> l;auto p = l.begin(); std::list<Foo>::iteratorauto& x = l.front(); std::list<Foo>::value_type&

auto& y = any-expression-here;

Monday, September 19, 2011

Type Deduction

10

void print_3x(vector<float> const& v){ for ( auto p = v.begin(); p != v.end(); p++ ) { std::cout << *p * 3 << " "; }}

Monday, September 19, 2011

Range-based for loop

11

void print_3x(vector<float> const& v){ for ( auto p = v.begin(); p != v.end(); p++ ) { std::cout << *p * 3 << " "; }}

Monday, September 19, 2011

Range-based for loop

12

void print_3x(vector<float> const& v){ for ( float a: v ) { std::cout << a * 3 << " "; }}

Monday, September 19, 2011

Range-based for loop

12

void print_3x(vector<float> const& v){ for ( float a: v ) { std::cout << a * 3 << " "; }}

Range

Monday, September 19, 2011

Range-based for loop

12

void print_3x(vector<float> const& v){ for ( float a: v ) { std::cout << a * 3 << " "; }}

Loop variable Range

Monday, September 19, 2011

auto in C++11Range-based for loop

13

void print_3x(vector<float> const& v){ for ( auto a: v ) { std::cout << a * 3 << " "; }}

Monday, September 19, 2011

Range-based for loop

14

template <class Range>void print_3x(Range const& v){ for ( typename Range::value_type a: v ) { std::cout << a * 3 << " "; }}

Monday, September 19, 2011

auto in C++11Range-based for loop

15

template <class Range>void print_3x(Range const& v){ for ( auto a: v ) { std::cout << a * 3 << " "; }}

Monday, September 19, 2011

auto in C++11Range-based for loop

16

void inplace_3x(vector<float>& v){ for ( float& a: v ) { a *= 3; }}

Monday, September 19, 2011

Ranges Everywhere

17

int rng[3] = { 42, 314, 77 };for( int var: rng ){ ...}

Monday, September 19, 2011

Ranges Everywhere

18

std::pair<Iter,Iter> rng = … ;for( int var: rng ){ ...}

Monday, September 19, 2011

Ranges Everywhere

19

YourType rng;for( int var: rng ){ ...}

Monday, September 19, 2011

Range-based for loop

20

void print_3x(vector<float> const& v){ BOOST_FOREACH( float a, v ) { std::cout << a * 3 << " "; }}

C++98

Monday, September 19, 2011

Range-based for loop

20

void print_3x(vector<float> const& v){ BOOST_FOREACH( float a, v ) { std::cout << a * 3 << " "; }}

“ ”C++98

Monday, September 19, 2011

Range-based for loop

20

void print_3x(vector<float> const& v){ BOOST_FOREACH( float a, v ) { std::cout << a * 3 << " "; }}

“ ”C++98

See your friendly neighborhood Boost C++ Libraries for details

Monday, September 19, 2011

Using an Algorithm

21

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(), );}

Monday, September 19, 2011

Using an Algorithm

21

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(), );}

Monday, September 19, 2011

Using an Algorithm

21

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(), );}

Monday, September 19, 2011

Using an Algorithm

21

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(), );}

static void print_3x_element(float a){ std::cout << a * 3 << " ";}

Monday, September 19, 2011

Using an Algorithm

21

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(), );}

static void print_3x_element(float a){ std::cout << a * 3 << " ";}

print_3x_element

Monday, September 19, 2011

Using an Algorithm

21

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(), );}

static void print_3x_element(float a){ std::cout << a * 3 << " ";}

print_3x_element

Monday, September 19, 2011

Lambda Expressions

22

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

);}

Monday, September 19, 2011

Lambda Expressions

22

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

);}

“Lambda expression”

[](float a) { std::cout << a * 3 << " "; }

Monday, September 19, 2011

Lambda Expressions

23

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

[](float a) { std::cout << a * 3 << " "; } );}

Monday, September 19, 2011

Lambda Expressions

23

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

[](float a) { std::cout << a * 3 << " "; } );}

introducer

Monday, September 19, 2011

What It Is

24

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

[](float a) { std::cout << a * 3 << " "; } );}

Monday, September 19, 2011

What It Is

24

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

[](float a) { std::cout << a * 3 << " "; } );}

struct __lambda143{ inline void operator()(float a) const { std::cout << a * 3 << " "; }};

anonymous class

Monday, September 19, 2011

What It Is

24

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

[](float a) { std::cout << a * 3 << " "; } );}

struct __lambda143{ inline void operator()(float a) const { std::cout << a * 3 << " "; }};

anonymous class

Monday, September 19, 2011

What It Is

24

void print_3x(vector<float> const& v){ std::for_each( v.begin(), v.end(),

[](float a) { std::cout << a * 3 << " "; } );}

struct __lambda143{ inline void operator()(float a) const { std::cout << a * 3 << " "; }};

__lambda143()

anonymous class

“closure” instance

Monday, September 19, 2011

std::vector<std::pair<int, std::string>> x;

Closing Angle Brackets

25

Monday, September 19, 2011

std::vector<std::pair<int, std::string>> x;

Closing Angle Brackets

25

Error in C++98: >> tokenized as right-shift

Dummy

Monday, September 19, 2011

std::vector<std::pair<int, std::string>> x;

Closing Angle Brackets

25

OK in C++11

Dummy

Monday, September 19, 2011

Move SemanticsA Really Cheap Lunch

26

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C D

A

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C D

A B

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C D

A B C

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

27

• A B C D

A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

28

• A B C D

A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

28

A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

28

• A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

28

• A B C D E

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

28

• A B C D E

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Copy Fatigue?

28

• A B C D E

Expensive copies are made just

before destroying the source

object

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

29

• B C DA

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

29

• B C D

A

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

29

B

C D

A

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

29

B C

D

A

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

29

B C DA

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

29

B C DA

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

30

A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

30

• A B C D

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

30

• A B C D E

Monday, September 19, 2011

typedef set<string> record;typedef vector<record> database;

database load_db(string filename);database db = load_db("huge.db");

db.push_back( create_record() );

Try Moving Instead!

30

• A B C D E

Monday, September 19, 2011

Move Mini-HOWTOMove-enabling an existing class

31

Monday, September 19, 2011

X

Move-Enabling

32

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• X

Monday, September 19, 2011

X

Move-Enabling

32

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• X

Monday, September 19, 2011

X

Move-Enabling

32

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• X

Monday, September 19, 2011

X

Move-Enabling

32

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• X

Monday, September 19, 2011

X

Move-Enabling

32

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• X

Monday, September 19, 2011

X

Move-Enabling

32

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• X

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

• Z

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

• Z

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

• Z

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

Monday, September 19, 2011

Y

Move-Enabling

33

struct Owner { Owner(const Owner& src) : p(src.p ? new Resource(*src.p) : 0) {}

Owner& operator=(const Owner& src) { if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

~Owner() { delete p; }private: Resource* p;};

• Y

Monday, September 19, 2011

New Move Operations

{ if (this == &src) return *this; delete p; p = 0; if (src.p) p = new Resource(*src.p); return *this; }

34

struct Owner { Owner(const Owner& src)

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(const Owner& src)

: p(src.p ? new Resource(*src.p) : 0) {}

Monday, September 19, 2011

New Move Operations

34

struct Owner { Owner(const Owner& src)

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(const Owner& src)

Monday, September 19, 2011

New Move Operations

34

struct Owner { Owner(const Owner& src)

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(const Owner& src)

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

X• X

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

X• X

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

rvalue reference

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

rvalue reference

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

Monday, September 19, 2011

Move Constructor

35

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

~Owner() { delete p; }private: Resource* p;};

Owner(Owner&& src) : p(src.p) { src.p = 0; }

X• X

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Y•

• Z

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(Owner&& src) { if (this == &src) return *this; delete p; p = src.p; src.p = 0; return *this; }

Y•

• Z

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(Owner&& src) { if (this == &src) return *this; delete p; p = src.p; src.p = 0; return *this; }

Y•

• Z

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(Owner&& src) { if (this == &src) return *this; delete p; p = src.p; src.p = 0; return *this; }

Y•

• Z

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(Owner&& src) { if (this == &src) return *this; delete p; p = src.p; src.p = 0; return *this; }

Y•

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(Owner&& src) { if (this == &src) return *this; delete p; p = src.p; src.p = 0; return *this; }

Y•

Monday, September 19, 2011

Move Assignment

36

struct Owner { Owner(const Owner& src); Owner& operator=(const Owner& src);

Owner(Owner&& src) : p(src.p) { src.p = 0; }

~Owner() { delete p; }private: Resource* p;};

Owner& operator=(Owner&& src) { if (this == &src) return *this; delete p; p = src.p; src.p = 0; return *this; }

Y

Monday, September 19, 2011

Move Semantics

• Automatically accelerates existing code!

• Applied throughout standard library

• Many move-only types in library

• Launches a new era of value semantics

37

Monday, September 19, 2011

Containers

• Move semantics

• Hash containers

• forward_list

• array

• tuple

• Emplace

• Allocators

38

Monday, September 19, 2011

Other Useful Libraries

• regex:

• Algorithms

• function / bind

39

Monday, September 19, 2011

Smart Pointers

• unique_ptr

• shared_ptr

40

Monday, September 19, 2011

Classes and OOP

• member initializers

• explict conversion

• override and final

• delegating and inheriting constructors

• defaulted and deleted functions

41

Monday, September 19, 2011

Concurrency

• async, futures, promise

• locks, mutexes and condition variables

• exception propagation

• atomics

42

Monday, September 19, 2011

Templates

• Variadics

• static_assert

• local classes as template arguments

• extern templates

• Template aliases

43

Monday, September 19, 2011

Metaprogramming

• constexpr

• Template aliases

• User-defined literals w/variadic templates

• Type traits and extended SFINAE

44

Monday, September 19, 2011

What’s Next?

• Modules

• Concepts

• Pythy Syntax:

• []min(x, y) { return x < y ? x : y }

45

Monday, September 19, 2011

top related