c++11 (formerly known as c++0x) is the new c++ language standard. dave abrahams, boostpro computing
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