SlideShare uma empresa Scribd logo
1 de 72
C++11

                      Alex Sinyakov,
   Software Engineer at AMC Bridge
               Twitter: @innochenti
     E-mail: innochenti@gmail.com
   PDF Slides: http://j.mp/cpp11ref
null pointer constant
C++03
void foo(char*);
void foo(int);

foo(NULL);
null pointer constant
C++03                           C++11
void foo(char*);                void foo(char*);
void foo(int);                  void foo(int);

foo(NULL); //calls second foo   foo(nullptr); //calls first foo
standard types
C++03
sizeof(int) == ?
sizeof(char) == 1 byte(== ? bits)

sizeof(char) <= sizeof(short) <=
sizeof(int) <= sizeof(long)
standard types
C++03                             C++11
sizeof(int) == ?                  int8_t
sizeof(char) == 1 byte(== ? bits) uint8_t
                                  int16_t
sizeof(char) <= sizeof(short) <= uint16_t
sizeof(int) <= sizeof(long)       int32_t
                                  uint32_t
                                  int64_t
                                  uint64_t
raw string literals
C++03                                                C++11
string test="C:ABCDfile1.txt";             string test=R"(C:ABCDfile1.txt)";
cout << test << endl;                                cout << test << endl;

C:ABCDfile1.txt                                 C:ABCDfile1.txt

string test;                                         string test;
test = "First Line.nSecond line.nThird Line.n";   test = R"(First Line.nSecond line.nThird Line.n)";
cout << test << endl;                                cout << test << endl;

First Line.                                          First Line.nSecond line.nThird Line.n
Second line.
Third Line.
                                                     string test =
                                                     R"(First Line.
                                                     Second line.
                                                     Third Line.)";
                                                     cout << test << endl;
                                                     First Line.
                                                     Second line.
                                                     Third Line.
in-class member initializers
C++03                            C++11
class A                          class A
{                                {
public:                          public:
  A(): a(4), b(2),                 A() {}
   h("text1"), s("text2") {}       A(int in_a) : a(in_a) {}
  A(int in_a) : a(in_a), b(2),     A(C c) {}
   h("text1"), s("text2") {}     private:
  A(C c) : a(4), b(2),             int a = 4;
   h("text1"), s("text2") {}       int b = 2;
private:                           string h = "text1";
  int a;                           string s = "text2";
  int b;                         };
  string h;
  string s;
};
delegating constructors
C++03                                             C++11
class A                                           class A
{                                                 {
  int a;                                            int a;
                                                  public:
  void validate(int x)
                                                    A(int x)
  {                                                 {
    if (0<x && x<=42) a=x; else throw bad_A(x);       if (0<x && x<=42) a=x; else throw bad_A(x);
  }                                                 }
public:                                             A() : A(42){ }
  A(int x) { validate(x); }                         A(string s) : A(stoi(s)){ }
  A() { validate(42); }                           };
  A(string s)
  {
    int x = stoi(s);
    validate(x);
  }
};
override
C++03                              C++11
struct Base                        struct Base
{                                  {
  virtual void some_func(float);     virtual void some_func(float);
};                                 };

struct Derived : Base              struct Derived : Base
{                                  {
  virtual void some_func(int);       void some_func(int) override;
  //warning                          //error
};                                 };
final
C++11                         Java
struct Base1 final {};        final class Base1 {}
struct Derived1 : Base1{      class Derived1 extends Base1 {
//error                       //error
};                            }

struct Base2{                 class Base2 {
 virtual void f() final;        public final void f(){};
};                            }

struct Derived2 : Base2 {     class Derived2 extends Base2 {
 void f(); //error              public void f(){}; //error
};                            }
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(){
  int64_t v; // 8 bytes
  f(v);
}
vs2010/2012 output:
1>d:main.cpp(5): error C2338: v must have size of 4 bytes
type traits
C++11                                                             Output
#include <type_traits>
#include <iostream>
using namespace std;

struct A { };
struct B { virtual void f(){} };
struct C : B {};

int main()
{
  cout << "int:" << has_virtual_destructor<int>::value << endl;   int:0
  cout << "int:"<< is_polymorphic<int>::value << endl;            int:0
  cout << "A: " << is_polymorphic<A>::value << endl;              A: 0
  cout << "B: " << is_polymorphic<B>::value << endl;              B: 1
  cout << "C: " << is_polymorphic<C>::value << endl;              C: 1
  typedef int mytype[][24][60];
  cout << "(0 dim.): " << extent<mytype,0>::value << endl;        (0st dim.): 0
  cout << "(1 dim.): " << extent<mytype,1>::value << endl;        (1st dim.): 24
  cout << "(2 dim.): " << extent<mytype,2>::value << endl;        (2st dim.): 60
  return 0;
}
auto
C++03                                               C++11
map<string,string>::iterator it = m.begin(); auto it = m.begin();
double const param = config["param"];        auto const param = config["param"];
singleton& s = singleton::instance();        auto& s = singleton::instance();
                           Prefer using auto in the following cases:
auto p = new T();
Here is T in the expression. No need to repeat it again.

auto p = make_shared<T>(arg1);
The same as above.

auto my_lambda = [](){};
If you need to store lambda you may use auto or std::function

auto it = m.begin();
Instead of: map<string,list<int>::iterator>::const_iterator it = m.cbegin();

http://programmers.stackexchange.com/questions/180216/does-auto-make-c-code-harder-to-
understand
decltype
C++11                      C++11
int main(){                int main(){
 int i = 4;                 int i = 4;
 const int j = 6;           const int j = 6;
 const int& k = i;          const int& k = i;
 int a[5];                  int a[5];
 int *p;                    int *p;
                            //decltype is an operator for querying the type of an expression.
                            //similarly to the sizeof operator, the operand of decltype is unevaluated.
    int var1;               decltype(i) var1;
    int var2;               decltype(1) var2;
    int var3;               decltype(2+3) var3;
    int& var4 = i;          decltype(i=1) var4 = i; //there is no assignment i to 1
    //                      // i == 4 as before
    const int var5 = 1;     decltype(j) var5 = 1;
    const int& var6 = j;    decltype(k) var6 = j;
    int var7[5];            decltype(a) var7;
    int& var8 = i;          decltype(a[3]) var8 = i;
    int& var9 = i;          decltype(*p) var9 = i;

    return 0;                  return 0;
}                          }
suffix return type syntax
C++11
template<class T, class U>
??? add(T x, U y)
//return type???
{
  return x+y;
}
suffix return type syntax
C++11
template<class T, class U>   template<class T, class U>
??? add(T x, U y)            decltype(x+y) add(T x, U y)
//return type???             //scope problem
{                            {
  return x+y;                  return x+y;
}                            }
suffix return type syntax
C++11
template<class T, class U>                  template<class T, class U>
??? add(T x, U y)                           decltype(x+y) add(T x, U y)
//return type???                            //scope problem
{                                           {
  return x+y;                                 return x+y;
}                                           }


template<class T, class U>
decltype(*(T*)(0)+*(U*)(0)) add(T x, U y)
// ugly!
{
  return x+y;
}
suffix return type syntax
C++11
template<class T, class U>                  template<class T, class U>
??? add(T x, U y)                           decltype(x+y) add(T x, U y)
//return type???                            //scope problem
{                                           {
  return x+y;                                 return x+y;
}                                           }


template<class T, class U>                  template<class T, class U>
decltype(*(T*)(0)+*(U*)(0)) add(T x, U y)   auto add(T x, U y) -> decltype(x+y)
// ugly!                                    {
{                                             return x+y;
  return x+y;                               }
}
suffix return type syntax
C++03                                        C++11
struct LinkedList                            struct LinkedList
{                                            {
  struct Link { /* ... */ };                   struct Link { /* ... */ };
  Link* erase(Link* p);                        Link* erase(Link* p);
  // ...                                       // ...
};                                           };

LinkedList::Link* LinkedList::erase(Link* p) auto LinkedList::erase(Link* p) -> Link*
{ /* ... */ }                                { /* ... */ }
std::function
C++11
int sum(int a, int b) { return a + b; }

function<int (int, int)> fsum = &sum;

fsum(4,2);
std::function
C++11
struct Foo
{
  void f(int i){}
};

function<void(Foo&, int)> fmember = mem_fn(&Foo::f);

Foo foo;
fmember(foo, 42);
std::function
C++11
struct Foo
{
  void f(int i){}
};

Foo foo;
function<void(int)> fmember = bind(&Foo::f, foo, _1);

fmember(42);
std::bind
C++11                                                     output
float div(float a, float b){ return a/b; }
cout << “6/1” << div(6,1);                                6/1 = 6
cout << “6/2” << div(6,2);                                6/2 = 3
cout << “6/3” << div(6,3);                                6/3 = 2

function<float(float, float)> inv_div = bind(div, _2, _1);
cout << “1/6” << inv_div(6,1);                             1/6 = 0.166
cout << “2/6” << inv_div(6,2);                             2/6 = 0.333
cout << “3/6” << inv_div(6,3);                             3/6 = 0.5

function<float(float)> div_by_6 = bind(div, _1, 6);       1/6 = 0.166
cout << “1/6” << div_by_6 (1);                            2/6 = 0.333
cout << “2/6” << div_by_6 (2);                            3/6 = 0.5
cout << “3/6” << div_by_6 (3);
std::bind
C++11
//Practical usage
linear_congruential_engine<uint64_t, 1103545, 123, 21478> generator(1127590);
uniform_int_distribution<int> distribution(1,6);
int rnd = distribution(generator);

//Let’s make things a little bit easier:
auto dice = bind( distribution, generator );
int rnd = dice()+dice()+dice();
function objects
C++11(deprecated binders             C++11
and adaptors)
unary_function,                      Function wrappers
binary_function,                     function
ptr_fun,                             mem_fn
pointer_to_unary_function,           bad_function_call
pointer_to_binary_function,
mem_fun,                             Bind
mem_fun_t,                           bind
mem_fun1_t                           is_bind_expression
const_mem_fun_t                      is_placeholder
const_mem_fun1_t                     _1, _2, _3, ...
mem_fun_ref
mem_fun_ref_t                        Reference wrappers
mem_fun1_ref_t                       reference_wrapper
const_mem_fun_ref_t                  ref
const_mem_fun1_ref_t                 cref
binder1st
binder2nd
bind1st
bind2nd
lambdas
C++03
struct functor
{
  int &a;
  functor(int& _a)
  : a(_a)
  {
  }
  bool operator()(int x) const
  {
    return a == x;
  }
};
int a = 42;
count_if(v.begin(), v.end(), functor(a));
lambdas
C++03                                       C++11
struct functor                              int a = 42;
{                                           count_if(v.begin(), v.end(), [&a](int x){ return
  int &a;                                   x == a;});
  functor(int& _a)
  : a(_a)
  {                                         C++14
  }                                         //possible C++14 lambdas
  bool operator()(int x) const              count_if(v.begin(),v.end(),[&a](auto x)x == a);
  {
    return a == x;                          http://isocpp.org/blog/2012/12/an-
  }                                         implementation-of-generic-lambdas-request-
};                                          for-feedback-faisal-vali
int a = 42;
count_if(v.begin(), v.end(), functor(a));
lambdas/closures
C++11                                                             test scope lambda scope
void test()
{
  int x = 4;                                                      x=4
  int y = 5;                                                      y=5
  [&](){x = 2;y = 2;}();                                          x=2 y=2   x=2 y=2
  [=]() mutable{x = 3;y = 5;}();                                  x=2 y=2   x=3 y=5
  [=,&x]() mutable{x = 7;y = 9;}();                               x=7 y=2   x=7 y=9
}
void test()
{
  int x = 4;                                                      x=4
  int y = 5;                                                      y=5
  auto z = [=]() mutable{x = 3;++y; int w = x + y; return w; };             //closure
                                                                            //x,y lives inside z
    z();                                                          x=4 y=5   x=3 y=6 w=9
    z();                                                          x=4 y=5   x=3 y=7 w=10
    z();                                                          x=4 y=5   x=3 y=8 w=11
}
recursive lambdas
function<int(int)> f = [&f](int n)
{
  return n <= 1 ? 1 : n * f(n - 1);
};

int x = f(4); //x = 24
std::tuple
C++11                                      python
tuple<int,float,string> t(1,2.f,”text”);   t = (1,2.0,’text’)
int x = get<0>(t);                         x = t[0]
float y = get<1>(t);                       y = t[1]
string z = get<2>(t);                      z = t[2]
int myint;
char mychar;
tuple<int,float,char> mytuple;
// packing values into tuple               // packing values into tuple
mytuple = make_tuple (10, 2.6, 'a');       mytuple = (10, 2.6, 'a')
// unpacking tuple into variables          // unpacking tuple into variables
tie(myint, ignore, mychar) = mytuple;      myint, _, mychar = mytuple
int a = 5;                                 a=5
int b = 6;                                 b=6
tie(b, a) = make_tuple(a, b);              b,a = a,b
std::tuple/std::tie(for lexicographical
                        comparison)
C++03                                                     C++11
struct Student                                            struct Student
{
  string name;                                            {
  int classId;                                              string name;
  int numPassedExams;                                       int classId;
 bool operator<(const Student& rhs) const                   int numPassedExams;
 {
   if(name < rhs.name)                                     bool operator<(const Student& rhs) const
     return true;
                                                           {
      if(name == rhs.name)                                   return tie(name, classId, numPassedExams) <
      {                                                       tie(rhs.name, rhs.classId, rhs.numPassedExams);
        if(classId < rhs.classId)
          return true;                                     }
                                                          };
          if(classId == rhs.classId)
            return numPassedExams < rhs.numPassedExams;
      }                                                   set<Student> students;

      return false;
  }
};

set<Student> students;
Uniform Initialization and
                            std::initializer_list
C++03                                                      C++11
int                          a[] = { 1, 2, 3, 4, 5 };      int         a[] = { 1, 2, 3, 4, 5 };
vector<int>                  v;                            vector<int> v = { 1, 2, 3, 4, 5 };
for( int i = 1; i <= 5; ++i ) v.push_back(i);

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


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


Vector3 x = normalize(Vector3(2,5,9));                     Vector3 x = normalize({2,5,9});
Vector3 y(4,2,1);                                          Vector3 y{4,2,1};
std::initializer_list
C++11
vector<int>    v = { 1, 2, 3, 4, 5 }; //How to make this works?
vector<int> v = { 1, 2, 3, 4, 5 };                         template<class T>
//vector(initializer_list<T> args) is called               class vector{
                                                            vector(initializer_list<T> args)
                                                            { /*rude, naive implementation to show how ctor
                                                           with initiailizer_list works*/
                                                              for(auto it = begin(args); it != end(args); ++it)
                                                               push_back(*it);
                                                            }
                                                           //…
                                                           };

//what is initializer_list<T> ?                            initializer_list<T> is a lightweight 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;
Uniform Initialization
C++11
//but wait!!! How then does this work??             The answer is:
struct Vector3{                                     now you can use {} instead of ()
float x,y,z;                                        But what about following case:
Vector3(float _x, float _y, float _z)               struct T {
 : x(_x), y(_y), z(_z){}                             T(int,int);
//I don’t see ctor with std::initializer_list!       T(initializer_list<int>);
                                                    };
};
                                                    T foo {10,20}; // calls initializer_list ctor
Vector3 normalize(const Vector3& v){                T bar (10,20); // calls first constructor
  float inv_len = 1.f/ length(v);
  return {v.x*inv_len, v.y*inv_len, v.z*inv_len};   Initializer-list constructors take precedence over other
}                                                   constructors when the initializer-list constructor syntax is
                                                    used!

Vector3 x = normalize({2,5,9});                     So, be careful! Consider following example:
Vector3 y{4,2,1};
                                                    vector<int> v(5); // v contains five elements {0,0,0,0,0}
                                                    vector<int> v{5}; // v contains one element {5}
Uniform Initialization
C++11
Uniform initialization solves many problems:
Narrowing
int x = 6.3; //warning!
int y {6.3}; //error: narrowing
int z = {6.3}; //error: narrowing
vector<int> v = { 1, 4.3, 4, 0.6 }; //error: double to int narrowing

“The most vexing parse” problem
struct B{                                                   struct B{
B(){}                                                       B(){}
};                                                          };

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

int main(){                                                 int main(){
A a(B()); //this is function declaration!                   A a{B()}; //calls B ctor, then A ctor. Everything is ok.
a.f(); //compile error!                                     a.f(); //calls A::f
return 0;                                                   return 0;
}                                                           }
Uniform Initialization and
              std::initializer_list
// Don’t mix std::initializer_list with auto
int n;
auto w(n); // int
auto x = n; // int
auto y {n}; // std::initializer_list<int>
auto z = {n}; // std::initializer_list<int>
using
C++03
typedef int int32_t; // on windows
typedef void (*Fn)(double);
template <int U, int V> class Type;

typedef Type<42,36> ConcreteType;
template<int V>                         template<int V>
typedef Type<42,V> MyType;              struct meta_type{
//error: not legal C++ code               typedef Type<42, V> type;
                                        };
MyType<36> object;                      typedef meta_type<36>::type MyType;
                                        MyType object;
using
C++03                                   C++11
typedef int int32_t; // on windows      using int32_t = int; // on windows
typedef void (*Fn)(double);             using Fn = void (*)(double);
template <int U, int V> class Type;     template <int U, int V> class Type;

typedef Type<42,36> ConcreteType;       using ConcreteType = Type<42,36>;
template<int V>                         template <int V>
struct meta_type{                       using MyType = Type<42, V>;
  typedef Type<42, V> type;
};
typedef meta_type<36>::type MyType;
MyType object;                          MyType<36> object;
explicit conversion operators
C++03
struct A { A(int){}; };
void f(A){};

int main(){
A a(1);
f(1); //silent implicit cast!
return 0;
}
explicit conversion operators
C++03
struct A {explicit A(int){}; };
void f(A){};

int main(){
A a(1);
f(1); //error: implicit cast!
return 0;
}
explicit conversion operators
C++03                                C++11
struct A {                           struct A {
 A(int) {}                            A(int) {}
};                                   };

struct B {                           struct B {
 int m;                               int m;
 B(int x) : m(x) {}                   B(int x) : m(x) {}
 operator A() { return A(m); }        explicit operator A() { return A(m); }
};                                   };

void f(A){}                          void f(A){}

int main(){                          int main(){
  B b(1);                              B b(1);
  A a = b; //silent implicit cast!     A a = b; //error: implicit cast!
  f(b); //silent implicit cast!        f(b); //error: implicit cast!
  return 0;                            return 0;
}                                    }
explicit conversion operators
C++03                                C++11
struct A {                           struct A {
 A(int) {}                            A(int) {}
};                                   };

struct B {                           struct B {
 int m;                               int m;
 B(int x) : m(x) {}                   B(int x) : m(x) {}
 operator A() { return A(m); }        explicit operator A() { return A(m); }
};                                   };

void f(A){}                          void f(A){}

int main(){                          int main(){
  B b(1);                              B b(1);
  A a = b; //silent implicit cast!     A a = static_cast<A>(b);
  f(b); //silent implicit cast!        f(static_cast<A>(b));
  return 0;                            return 0;
}                                    }
control of defaults: default and delete
C++11
class A
{
  A& operator=(A) = delete; // disallow copying
  A(const A&) = delete;
};

struct B
{
  B(float); // can initialize with a float
  B(long) = delete; // but not with long
};

struct C
{
  virtual ~C() = default;
};
enum class - scoped and strongly
                 typed enums
C++03                                        C++11
enum Alert { green, yellow, red };           enum class Alert { green, yellow, red };
//enum Color{ red, blue };                   enum class Color : int{ red, blue };
//error C2365: 'red' : redefinition
                                             Alert a = 7; // error (as ever in C++)
Alert a = 7; // error (as ever in C++)       Color c = 7; // error: no int->Color conversion
int a2 = red; // ok: Alert->int conversion   int a2 = red; // error
int a3 = Alert::red; // error                int a3 = Alert::red; //error
                                             int a4 = blue; // error: blue not in scope
                                             int a5 = Color::blue; //error: not Color->int
                                             conversion
                                             Color a6 = Color::blue; //ok
user-defined literals
C++03                        C++11
123 // int                   1.2_i // imaginary
1.2 // double                123.4567891234_df // decimal floating point (IBM)
1.2F // float                101010111000101_b // binary
'a' // char                  123_s // seconds
1ULL // unsigned long long   123.56_km // not miles! (units)

                             Speed v = 100_km/1_h;

                             int operator "" _km(int val){
                               return val;
                             }

                             Practical usage:
                             http://www.codeproject.com/Articles/447922/Applic
                             ation-of-Cplusplus11-User-Defined-Literals-t
Move Semantics
C++03
typedef vector<float> Matrix;

//requires already created C
void Mul(const Matrix& A, const Matrix& B, Matrix& C);

//need to manage lifetime manually using new/delete
void Mul(const Matrix& A, const Matrix& B, Matrix* C);

//please, don’t forget to call delete
Matrix* operator*(const Matrix& A, const Matrix& B);

//no need to manage lifetime manually, but adds some
//performance and abstraction penalty
shared_ptr<Matrix> operator* (const Matrix& A, const
Matrix& B);
Move Semantics
C++03                                                    C++11
typedef vector<float> Matrix;                            typedef vector<float> Matrix;

//requires already created C
void Mul(const Matrix& A, const Matrix& B, Matrix& C);

//need to manage lifetime manually using new/delete
void Mul(const Matrix& A, const Matrix& B, Matrix* C);
                                                         //Cool syntax, no abstraction or performance
//please, don’t forget to call delete                    //penalty! Thanks to move semantics!
Matrix* operator*(const Matrix& A, const Matrix& B);     Matrix operator*(const Matrix& A, const Matrix& B);

//no need to manage lifetime manually, but adds some
//performance and abstraction penalty
shared_ptr<Matrix> operator* (const Matrix& A, const
Matrix& B);
                                                         Matrix A(10000);
                                                         Matrix B(10000);
                                                         Matrix C = A * B;
Move Semantics
C++11
typedef vector<float> Matrix;                         template<class T>
                                                      class vector
Matrix operator*(const Matrix& A, const Matrix& B);   {
{                                                       T* data;
  Matrix ret(A.size()); //ret.data = 0x0028fabc         size_t size;
  //ret.size = 100000
  //matrix multiplication algorithm                   public:
  //                                                   vector(vector<T>&& rhs)
  return ret; //vector<float>(vector<float>&&)         : data(rhs.data)
  //C.data = ret.data, C.size = ret.size               , size(rhs.size)
  //ret.data = nullptr, ret.size = 0                   {
}//~vector<float>()                                      rhs.data = nullptr;
  //delete ret.data; //”delete nullptr;” is ok.          rhs.size = 0;
                                                       }
Matrix A(10000);                                       ~vector()
Matrix B(10000);                                       {
Matrix C = A * B;                                        delete[] data;
                                                       }
//C.data = 0x0028fabc                                 //…
//C.size = 100000                                     };
Move Semantics
C++03                                                   C++11
typedef vector<float> BigObj;                           typedef vector<float> BigObj;
void f(BigObj&); //reference to lvalue                  void f(BigObj&&); //reference to rvalue
                                                        void f(BigObj&); //reference to lvalue

//test1                                                 //test1
BigObj x = createBigObject(); //BigObj(const BigObj&)   BigObj x = createBigObject();

f(x); //BigObj(const BigObj&)                           f(x); //BigObj(const BigObj&)
f(createBigObject()); //BigObj(const BigObj&)           f(createBigObject()); //BigObj(BigObj&&)

                                                        //test2
                                                        BigObj x = createBigObject();
                                                        f(move(x)); // move makes from input value – rvalue.

//test3                                                 //test3
BigObj createBigObject()                                BigObj createBigObject()
{                                                       {
BigObj object(100000); //value                          BigObj object(100000); //prvalue
return object; //BigObj(const BigObj&)                  return object; //BigObj(BigObj&&)
}//~BigObj                                              }//~BigObj

BigObj x = createBigObject();                           BigObj x = createBigObject();
constexpr
C++03                                          C++11
template<int N>                                constexpr int Fib(int n)
struct Fib{                                    {
 enum {                                         return n<=2 ? 1 : Fib(n-1)+Fib(n-2);
   value = Fib<N-1>::value + Fib<N-2>::value   }
 };
};                                             cout << Fib(15); //compile time

template<> struct Fib<1>{                      int a = 15;
 enum { value = 1 };                           cout << Fib(a); //runtime
};

template<> struct Fib<0> {
 enum { value = 0 };
};

cout << Fib<15>::value;
range-for, begin, end
C++03                                            C++11
vector<int> v;                                   vector<int> v;
for( vector<int>::iterator i = v.begin(); i !=   for( auto d : v )
v.end(); ++i )                                     total += d;
   total += *i;

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

int a[] = {1,2,3,4,5};                           int a[] = {1,2,3,4,5};
sort( &a[0], &a[0] + sizeof(a)/sizeof(a[0]));    sort( begin(a), end(a) );
Memory management
  (unique_ptr is safe replacement for
     unsafe deprecated auto_ptr)
C++11
unique_ptr<int> p1(new int(42));
unique_ptr<int> p2 = p1; //Compile error. Only “move” operation is possible.
unique_ptr<int> p3 = move(p1); //Transfers ownership. p3 now owns the memory and p1 is nullptr.
p3.reset(); //Deletes the memory.
p1.reset(); //Does nothing.

unique_ptr<int> createUniqueResource()
{
  unique_ptr<int> ret( new int(42) );
  return ret; //no need to move(ret);
}
F* OpenFile(char* name);
void CloseFile(F*);
/* custom deleter */

unique_ptr<F, function<decltype(CloseFile)>> file(OpenFile("text"), CloseFile);
file->read(1024);
Memory management
   (shared_ptr = ref(+weak) thread safe
void test()
                 counter)
{
     shared_ptr<int> p( new int(42) );         ref count = 1, weak count = 0
     {
            shared_ptr<int> x = p;             ref count = 2, weak count = 0
            {
              shared_ptr<int> y = p;           ref count = 3, weak count = 0
            }                                  ref count = 2, weak count = 0
     }                                         ref count = 1, weak count = 0
     // use weak_ptr to break reference-count cycles
     weak_ptr<int> wp = p;                     ref count = 1, weak count = 1 – note ref count is still 1
     shared_ptr<int> ap = wp.lock();           ref count = 2, weak count = 1
     {
              shared_ptr<int> y = ap;          ref count = 3, weak count = 1
     }                                         ref count = 2, weak count = 1
}                                     ap dtor: ref count = 1, weak count = 1
                                      wp dtor: ref count = 1, weak count = 0
                                      p dtor:  ref count = 0, weak count = 0 - destroy p!
Variadic templates
C++03                                          C++11
void f();                                      template <class ...T>
template<class T>                              void f(T... args);
void f(T arg1);
template<class T, class U>
void f(T arg1, U arg2);
template<class T, class U, class Y>
void f(T arg1, U arg2, Y arg3);
template<class T, class U, class Y, class Z>
void f(T arg1, U arg2, Y arg3, Z arg4);

f(“test”,42,’s’,12.f);                         f(“test”,42,’s’,12.f);
//… till some max N.
Variadic templates
C++11                                        C++11(call sequence)
template<class T>                            print_list(first = 42, ...rest = "hello",2.3,'a')
void print_list(T value)                      42
{                                             print_list(first = "hello", ...rest = 2.3,'a')
  cout<<value<<endl;                           hello
}                                              print_list(first = 2.3, ...rest = 'a')
                                                 2.3
template<class First, class ...Rest>             print_list(value ='a') //trivial case
void print_list(First first, Rest ...rest)       a
{
  cout<<first<<","; print_list(rest...);
}
                                             Output
print_list(42,"hello",2.3,'a');              42,hello,2.3,a
Tuple definition using
                      variadic templates
C++11
template<class... Elements>                           “LISP-style” definition:
class tuple;                                          A tuple is either:

template<>                                            - An empty tuple, or
class tuple<> {};

template<class Head, class... Tail>                   - A pair (head, tail) where head is
class tuple<Head, Tail...> : private tuple<Tail...>   the first element of the tuple and
{                                                     tail is a tuple containing the rest(…)
  Head head;                                          of the elements.
  //
};
Variadic templates
C++11                                     Haskell
template<int... Elements> struct count;   count [] = 0
                                          count (T:Args) = 1 + count Args
template<> struct count<>
{
  static const int value = 0;             //call
};                                        count [0,1,2,3,4]

template<int T, int... Args>
struct count<T, Args...>
{
  static const int value = 1 +
    count<Args...>::value;
};

//call
int x = count<0,1,2,3,4>::value;
Variadic templates(sizeof... operator)
C++11
template<int... Elements> struct count;   template<int... Elements>
                                          struct count
template<> struct count<>                 {
{                                           static const int value = sizeof...(Elements);
  static const int value = 0;             };
};
                                          /*
template<int T, int... Args>              sizeof...() – return the number elements in
struct count<T, Args...>                  a parameter pack
{                                         */
  static const int value = 1 +
    count<Args...>::value;                //call
};                                        int x = count<0,1,2,3,4>::value;

//call
int x = count<0,1,2,3,4>::value;
std::string
Interprets a signed integer value in the string:
int    stoi( const std::string& str, size_t *pos = 0, int base = 10 );
long stol( const std::string& str, size_t *pos = 0, int base = 10 );
long long stoll( const std::string& str, size_t *pos = 0, int base = 10 );

Interprets an unsigned integer value in the string:
unsigned long stoul( const std::string& str, size_t *pos = 0, int base = 10 );
unsigned long long stoull( const std::string& str, size_t *pos = 0, int base = 10 );

Interprets a floating point value in a string:
float    stof( const std::string& str, size_t *pos = 0 );
double stod( const std::string& str, size_t *pos = 0 );
long double stold( const std::string& str, size_t *pos = 0 );

Converts a (un)signed/decimal integer to a string/wstring:
to_string
to_wstring
std::array
C++03                                             C++11
char arr1[] = "xyz"; //'0' is added to the end   array<char, 3> arr1 = {'x', 'y', 'z'};
int arr2[] = {2112, 90125, 1928};                 array<int, 3> arr2 = {2112, 90125, 1928};




int* x = arr2; //ok                               int* x = arr2; //error
                                                  x = arr2.data(); //ok



cout << sizeof(arr1) - 1 << endl;                 cout << arr1.size() << endl;
cout << sizeof(arr2) / sizeof(int) << endl;       cout << arr2.size() << endl;


arr2[-42] = 36; //oops                            arr2.at(-42) = 36;
                                                  //throws std::out_of_range exception

http://stackoverflow.com/questions/6111565/now-that-we-have-stdarray-what-uses-are-left-for-c-
style-arrays
std::vector
C++03                                                         C++11
void c_style_f(int* x){}                                      void c_style_f(int* x){}

void test(){                                                  void test(){
 vector<int> v;                                                vector<int> v;

    if(!v.empty())                                                c_style_f(v.data());
      c_style_f(&v[0]);                                       }

    if(!v.empty())
      c_style_f(&v.front());

    if(!v.empty())
      c_style_f(&*v.begin());
}
vector<int> v;                                                vector<int> v;
v.push_back( 1 ); //capacity = 1                              v.push_back( 1 ); //capacity = 1
v.reserve( 20 ); //capacity = 20                              v.reserve( 20 ); //capacity = 20
vector<int>(v).swap(v); //capacity = 1                        v.shrink_to_fit(); //capacity = 1
//very intuitive!

struct Some_type{                                             struct Some_type{
  Some_type(int _x, int _y, int _z) : x(_x), y(_y), z(_z){}     Some_type(int _x, int _y, int _z) : x(_x), y(_y), z(_z){}
  int x,y,z;                                                    int x,y,z;
};                                                            };

vector<Some_type> v;                                          vector<Some_type> v;
v.push_back(Some_type(1,2,3));                                v.emplace_back(1,2,3);
STL
std::regex
bool equals = regex_match("subject", regex("(sub)(.*)") );

std::chrono
auto start = high_resolution_clock::now();
some_long_computations();
auto end = high_resolution_clock::now();
cout<<duration_cast<milliseconds>(end-start).count();

std::ratio
using sum = ratio_add<ratio<1,2>, ratio<2,3>>;

cout << "sum = " << sum::num << "/" << sum::den;
cout << " (which is: " << ( double(sum::num) / sum::den ) << ")" << endl;

Output: sum = 7/6 (which is: 1.166667)
STL
New algorithms:
std::all_of, std::none_of, std::any_of,
std::find_if_not, std::copy_if, std::copy_n,
std::move, std::move_n, std::move_backward,
std::shuffle, std::random_shuffle,
std::is_partitioned, std::partition_copy,
std::partition_point, std::is_sorted,
std::is_sorted_until, std::is_heap_until,
std::min_max, std::minmax_element,
std::is_permutation, std::iota
Threads and memory model
Threading support:
thread, mutex, condition variable,
future/promise, package task

Memory model:
atomic, fence

Difference between std::thread and boost::thread:
http://stackoverflow.com/questions/7241993/is-it-smart-to-replace-boostthread-and-boostmutex-with-
c11-equivalents
std::thread
C++11                       Java
#include <thread>           public class TestThread {
#include <iostream>

                              public static void main(String[] args) throws
int main()
                            InterruptedException {
{
                                Thread t1 = new Thread(new Runnable() {
  using namespace std;            public void run() {
  thread t1([](){                   System.out.println(“Hi from thread");
     cout << “Hi from             }
      thread” << endl;});       });
                                t1.start();
    t1.join();
                                    t1.join();
    return 0;
                                }
}                           }
std::mutex
C++11                                       Output(may vary)
#include <iostream>                         1: 0
#include <thread>
//version without mutex!!!                  1: 1
using namespace std;                        1: 2
void run(size_t n){                         1: 3
  for (size_t i = 0; i < 5; ++i){           1: 4
    cout << n << ": " << i << endl;
  }                                         23: 0
}                                           3: 1
int main(){                                 3: 2
  thread t1(run, 1);                        3: 3
  thread t2(run, 2);
  thread t3(run, 3);                        3: 4
    t1.join();
                                            :0
    t2.join();                              2: 1
    t3.join();                              2: 2
    return 0;                               2: 3
}                                           2: 4
std::mutex
C++11                                     Output(is defined within run)
#include <iostream>
#include <thread>
                                          1: 0
#include <mutex>                          1: 1
using namespace std;                      1: 2
mutex m;
                                          1: 3
                                          1: 4
void run(size_t n){
 m.lock();                                2: 0
 for (size_t i = 0; i < 5; ++i){          2: 1
   cout << n << ": " << i << endl;
 }                                        2: 2
    m.unlock();
                                          2: 3
}                                         2: 4
int main(){                               3: 0
 thread t1(run, 1);
 thread t2(run, 2);
                                          3: 1
 thread t3(run, 3);                       3: 2
    t1.join();                            3: 3
    t2.join();                            3: 4
    t3.join();

    return 0;
}
std::lock_guard+std::mutex
C++11
#include <iostream>                  #include <iostream>
#include <thread>                    #include <thread>
#include <mutex>                     #include <mutex>

using namespace std;                 using namespace std;

mutex m;                             mutex m;

void run(size_t n){                  void run(size_t n){
 m.lock();                             lock_guard<mutex> lm(m); //ctor – m.lock(), dtor – m.unlock()
 for (size_t i = 0; i < 5; ++i){       for (size_t i = 0; i < 5; ++i){
   cout << n << ": " << i << endl;       cout << n << ": " << i << endl;
 }                                     }
                                     }
    m.unlock();
}                                    int main(){
                                      thread t1(run, 1);
int main(){                           thread t2(run, 2);
 thread t1(run, 1);                   thread t3(run, 3);
 thread t2(run, 2);
 thread t3(run, 3);                      t1.join();
                                         t2.join();
    t1.join();                           t3.join();
    t2.join();
    t3.join();                           return 0;
                                     }
    return 0;
}
std::async
C++11
#include <iostream>
#include <future>

using namespace std;

int Fib(int n){
  return n<=2 ? 1 : Fib(n-1)+Fib(n-2);
}

int calc1(){ return Fib(30); }

int calc2(){ return Fib(40); }

int main()
{
  // start calc1() asynchronously
  future<int> result1 = async(calc1);
  // call calc2() synchronously
  int result2 = calc2();
  // wait for calc1() and add its result to result2
  int result = result1.get() + result2;
  cout << "calc1()+calc2(): " << result << endl;
  return 0;
}
Deprecated idioms
C++11
Now that we have C++11, we can use new features instead of following idioms:
nullptr
Move_Constructor
Safe_bool
Shrink-to-fit
Type_Safe_Enum
Requiring_or_Prohibiting_Heap-based_Objects
Type_Generator
Final_Class
address_of

http://stackoverflow.com/questions/9299101/what-c-idioms-are-deprecated-in-c11
C++11 compiler support
gcc                icc      msvc(with NOV CTP) Ibm xlc              clang

38/39              27/39    24/39                  17/39            37/39
Not implemented:   Full STL Full STL               Not              Full STL
threads, regex     support support(without init.   implemented:     support
                            list)                  threads, regex
links

http://www.isocpp.org

http://www.cplusplus.com

http://www.stroustrup.com/C++11FAQ.html

http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style

http://channel9.msdn.com/Events/Build/BUILD2011/TOOL-835T

http://channel9.msdn.com/posts/C-and-Beyond-2011-Herb-Sutter-Why-C

http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/-Not-Your-Father-s-C-

http://cpprocks.com/cpp11-stl-additions/

http://cpprocks.com/c11-a-visual-summary-of-changes/#!prettyPhoto

http://wiki.apache.org/stdcxx/C++0xCompilerSupport

Mais conteúdo relacionado

Mais procurados

Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」
Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」
Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」Tomoaki Shimizu
 
C++ Programming Course
C++ Programming CourseC++ Programming Course
C++ Programming CourseDennis Chang
 
用十分鐘 向jserv學習作業系統設計
用十分鐘  向jserv學習作業系統設計用十分鐘  向jserv學習作業系統設計
用十分鐘 向jserv學習作業系統設計鍾誠 陳鍾誠
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!amusementcreators
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Understand more about C
Understand more about CUnderstand more about C
Understand more about CYi-Hsiu Hsu
 
Q2.12: Debugging with GDB
Q2.12: Debugging with GDBQ2.12: Debugging with GDB
Q2.12: Debugging with GDBLinaro
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法Yoshifumi Kawai
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!Akihiro Nishimura
 
Introduction to gdb
Introduction to gdbIntroduction to gdb
Introduction to gdbOwen Hsu
 
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
 

Mais procurados (20)

Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」
Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」
Cocos2d-x(JS) ハンズオン #12「Cocos2d-xとSpine」
 
C++ Programming Course
C++ Programming CourseC++ Programming Course
C++ Programming Course
 
用十分鐘 向jserv學習作業系統設計
用十分鐘  向jserv學習作業系統設計用十分鐘  向jserv學習作業系統設計
用十分鐘 向jserv學習作業系統設計
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Learn C Programming Language by Using GDB
Learn C Programming Language by Using GDBLearn C Programming Language by Using GDB
Learn C Programming Language by Using GDB
 
Understand more about C
Understand more about CUnderstand more about C
Understand more about C
 
Q2.12: Debugging with GDB
Q2.12: Debugging with GDBQ2.12: Debugging with GDB
Q2.12: Debugging with GDB
 
from Source to Binary: How GNU Toolchain Works
from Source to Binary: How GNU Toolchain Worksfrom Source to Binary: How GNU Toolchain Works
from Source to Binary: How GNU Toolchain Works
 
88 c-programs
88 c-programs88 c-programs
88 c-programs
 
淺談探索 Linux 系統設計之道
淺談探索 Linux 系統設計之道 淺談探索 Linux 系統設計之道
淺談探索 Linux 系統設計之道
 
GDB Rocks!
GDB Rocks!GDB Rocks!
GDB Rocks!
 
C# Basics
C# BasicsC# Basics
C# Basics
 
Virtual Machine Constructions for Dummies
Virtual Machine Constructions for DummiesVirtual Machine Constructions for Dummies
Virtual Machine Constructions for Dummies
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
Introduction to gdb
Introduction to gdbIntroduction to gdb
Introduction to gdb
 
Interpreter, Compiler, JIT from scratch
Interpreter, Compiler, JIT from scratchInterpreter, Compiler, JIT from scratch
Interpreter, Compiler, JIT from scratch
 
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
 
C++ oop
C++ oopC++ oop
C++ oop
 

Semelhante a C++11 Features Reference

Computer science-2010-cbse-question-paper
Computer science-2010-cbse-question-paperComputer science-2010-cbse-question-paper
Computer science-2010-cbse-question-paperDeepak Singh
 
Basic c++ 11/14 for python programmers
Basic c++ 11/14 for python programmersBasic c++ 11/14 for python programmers
Basic c++ 11/14 for python programmersJen Yee Hong
 
Basic C++ 11/14 for Python Programmers
Basic C++ 11/14 for Python ProgrammersBasic C++ 11/14 for Python Programmers
Basic C++ 11/14 for Python ProgrammersAppier
 
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6 1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6  1ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6  1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6 1Little Tukta Lita
 
CBSE Question Paper Computer Science with C++ 2011
CBSE Question Paper Computer Science with C++ 2011CBSE Question Paper Computer Science with C++ 2011
CBSE Question Paper Computer Science with C++ 2011Deepak Singh
 
(Www.entrance exam.net)-tcs placement sample paper 2
(Www.entrance exam.net)-tcs placement sample paper 2(Www.entrance exam.net)-tcs placement sample paper 2
(Www.entrance exam.net)-tcs placement sample paper 2Pamidimukkala Sivani
 
D vs OWKN Language at LLnagoya
D vs OWKN Language at LLnagoyaD vs OWKN Language at LLnagoya
D vs OWKN Language at LLnagoyaN Masahiro
 
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1Little Tukta Lita
 
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)changehee lee
 
C aptitude.2doc
C aptitude.2docC aptitude.2doc
C aptitude.2docSrikanth
 
C++17 not your father’s c++
C++17  not your father’s c++C++17  not your father’s c++
C++17 not your father’s c++Patrick Viafore
 
More on Classes and Objects
More on Classes and ObjectsMore on Classes and Objects
More on Classes and ObjectsPayel Guria
 
C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)Saifur Rahman
 
CPP Language Basics - Reference
CPP Language Basics - ReferenceCPP Language Basics - Reference
CPP Language Basics - ReferenceMohammed Sikander
 

Semelhante a C++11 Features Reference (20)

Computer science-2010-cbse-question-paper
Computer science-2010-cbse-question-paperComputer science-2010-cbse-question-paper
Computer science-2010-cbse-question-paper
 
Basic c++ 11/14 for python programmers
Basic c++ 11/14 for python programmersBasic c++ 11/14 for python programmers
Basic c++ 11/14 for python programmers
 
Basic C++ 11/14 for Python Programmers
Basic C++ 11/14 for Python ProgrammersBasic C++ 11/14 for Python Programmers
Basic C++ 11/14 for Python Programmers
 
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6 1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6  1ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6  1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม. 6 1
 
CBSE Question Paper Computer Science with C++ 2011
CBSE Question Paper Computer Science with C++ 2011CBSE Question Paper Computer Science with C++ 2011
CBSE Question Paper Computer Science with C++ 2011
 
Revision1 C programming
Revision1 C programmingRevision1 C programming
Revision1 C programming
 
(Www.entrance exam.net)-tcs placement sample paper 2
(Www.entrance exam.net)-tcs placement sample paper 2(Www.entrance exam.net)-tcs placement sample paper 2
(Www.entrance exam.net)-tcs placement sample paper 2
 
D vs OWKN Language at LLnagoya
D vs OWKN Language at LLnagoyaD vs OWKN Language at LLnagoya
D vs OWKN Language at LLnagoya
 
Codejunk Ignitesd
Codejunk IgnitesdCodejunk Ignitesd
Codejunk Ignitesd
 
Lecture05
Lecture05Lecture05
Lecture05
 
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
 
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
 
TechTalk - Dotnet
TechTalk - DotnetTechTalk - Dotnet
TechTalk - Dotnet
 
C tutorial
C tutorialC tutorial
C tutorial
 
C aptitude.2doc
C aptitude.2docC aptitude.2doc
C aptitude.2doc
 
Captitude 2doc-100627004318-phpapp01
Captitude 2doc-100627004318-phpapp01Captitude 2doc-100627004318-phpapp01
Captitude 2doc-100627004318-phpapp01
 
C++17 not your father’s c++
C++17  not your father’s c++C++17  not your father’s c++
C++17 not your father’s c++
 
More on Classes and Objects
More on Classes and ObjectsMore on Classes and Objects
More on Classes and Objects
 
C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)
 
CPP Language Basics - Reference
CPP Language Basics - ReferenceCPP Language Basics - Reference
CPP Language Basics - Reference
 

Último

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 

Último (20)

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 

C++11 Features Reference

  • 1. C++11 Alex Sinyakov, Software Engineer at AMC Bridge Twitter: @innochenti E-mail: innochenti@gmail.com PDF Slides: http://j.mp/cpp11ref
  • 2. null pointer constant C++03 void foo(char*); void foo(int); foo(NULL);
  • 3. null pointer constant C++03 C++11 void foo(char*); void foo(char*); void foo(int); void foo(int); foo(NULL); //calls second foo foo(nullptr); //calls first foo
  • 4. standard types C++03 sizeof(int) == ? sizeof(char) == 1 byte(== ? bits) sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
  • 5. standard types C++03 C++11 sizeof(int) == ? int8_t sizeof(char) == 1 byte(== ? bits) uint8_t int16_t sizeof(char) <= sizeof(short) <= uint16_t sizeof(int) <= sizeof(long) int32_t uint32_t int64_t uint64_t
  • 6. raw string literals C++03 C++11 string test="C:ABCDfile1.txt"; string test=R"(C:ABCDfile1.txt)"; cout << test << endl; cout << test << endl; C:ABCDfile1.txt C:ABCDfile1.txt string test; string test; test = "First Line.nSecond line.nThird Line.n"; test = R"(First Line.nSecond line.nThird Line.n)"; cout << test << endl; cout << test << endl; First Line. First Line.nSecond line.nThird Line.n Second line. Third Line. string test = R"(First Line. Second line. Third Line.)"; cout << test << endl; First Line. Second line. Third Line.
  • 7. in-class member initializers C++03 C++11 class A class A { { public: public: A(): a(4), b(2), A() {} h("text1"), s("text2") {} A(int in_a) : a(in_a) {} A(int in_a) : a(in_a), b(2), A(C c) {} h("text1"), s("text2") {} private: A(C c) : a(4), b(2), int a = 4; h("text1"), s("text2") {} int b = 2; private: string h = "text1"; int a; string s = "text2"; int b; }; string h; string s; };
  • 8. delegating constructors C++03 C++11 class A class A { { int a; int a; public: void validate(int x) A(int x) { { if (0<x && x<=42) a=x; else throw bad_A(x); if (0<x && x<=42) a=x; else throw bad_A(x); } } public: A() : A(42){ } A(int x) { validate(x); } A(string s) : A(stoi(s)){ } A() { validate(42); } }; A(string s) { int x = stoi(s); validate(x); } };
  • 9. override C++03 C++11 struct Base struct Base { { virtual void some_func(float); virtual void some_func(float); }; }; struct Derived : Base struct Derived : Base { { virtual void some_func(int); void some_func(int) override; //warning //error }; };
  • 10. final C++11 Java struct Base1 final {}; final class Base1 {} struct Derived1 : Base1{ class Derived1 extends Base1 { //error //error }; } struct Base2{ class Base2 { virtual void f() final; public final void f(){}; }; } struct Derived2 : Base2 { class Derived2 extends Base2 { void f(); //error public void f(){}; //error }; }
  • 11. 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(){ int64_t v; // 8 bytes f(v); } vs2010/2012 output: 1>d:main.cpp(5): error C2338: v must have size of 4 bytes
  • 12. type traits C++11 Output #include <type_traits> #include <iostream> using namespace std; struct A { }; struct B { virtual void f(){} }; struct C : B {}; int main() { cout << "int:" << has_virtual_destructor<int>::value << endl; int:0 cout << "int:"<< is_polymorphic<int>::value << endl; int:0 cout << "A: " << is_polymorphic<A>::value << endl; A: 0 cout << "B: " << is_polymorphic<B>::value << endl; B: 1 cout << "C: " << is_polymorphic<C>::value << endl; C: 1 typedef int mytype[][24][60]; cout << "(0 dim.): " << extent<mytype,0>::value << endl; (0st dim.): 0 cout << "(1 dim.): " << extent<mytype,1>::value << endl; (1st dim.): 24 cout << "(2 dim.): " << extent<mytype,2>::value << endl; (2st dim.): 60 return 0; }
  • 13. auto C++03 C++11 map<string,string>::iterator it = m.begin(); auto it = m.begin(); double const param = config["param"]; auto const param = config["param"]; singleton& s = singleton::instance(); auto& s = singleton::instance(); Prefer using auto in the following cases: auto p = new T(); Here is T in the expression. No need to repeat it again. auto p = make_shared<T>(arg1); The same as above. auto my_lambda = [](){}; If you need to store lambda you may use auto or std::function auto it = m.begin(); Instead of: map<string,list<int>::iterator>::const_iterator it = m.cbegin(); http://programmers.stackexchange.com/questions/180216/does-auto-make-c-code-harder-to- understand
  • 14. decltype C++11 C++11 int main(){ int main(){ int i = 4; int i = 4; const int j = 6; const int j = 6; const int& k = i; const int& k = i; int a[5]; int a[5]; int *p; int *p; //decltype is an operator for querying the type of an expression. //similarly to the sizeof operator, the operand of decltype is unevaluated. int var1; decltype(i) var1; int var2; decltype(1) var2; int var3; decltype(2+3) var3; int& var4 = i; decltype(i=1) var4 = i; //there is no assignment i to 1 // // i == 4 as before const int var5 = 1; decltype(j) var5 = 1; const int& var6 = j; decltype(k) var6 = j; int var7[5]; decltype(a) var7; int& var8 = i; decltype(a[3]) var8 = i; int& var9 = i; decltype(*p) var9 = i; return 0; return 0; } }
  • 15. suffix return type syntax C++11 template<class T, class U> ??? add(T x, U y) //return type??? { return x+y; }
  • 16. suffix return type syntax C++11 template<class T, class U> template<class T, class U> ??? add(T x, U y) decltype(x+y) add(T x, U y) //return type??? //scope problem { { return x+y; return x+y; } }
  • 17. suffix return type syntax C++11 template<class T, class U> template<class T, class U> ??? add(T x, U y) decltype(x+y) add(T x, U y) //return type??? //scope problem { { return x+y; return x+y; } } template<class T, class U> decltype(*(T*)(0)+*(U*)(0)) add(T x, U y) // ugly! { return x+y; }
  • 18. suffix return type syntax C++11 template<class T, class U> template<class T, class U> ??? add(T x, U y) decltype(x+y) add(T x, U y) //return type??? //scope problem { { return x+y; return x+y; } } template<class T, class U> template<class T, class U> decltype(*(T*)(0)+*(U*)(0)) add(T x, U y) auto add(T x, U y) -> decltype(x+y) // ugly! { { return x+y; return x+y; } }
  • 19. suffix return type syntax C++03 C++11 struct LinkedList struct LinkedList { { struct Link { /* ... */ }; struct Link { /* ... */ }; Link* erase(Link* p); Link* erase(Link* p); // ... // ... }; }; LinkedList::Link* LinkedList::erase(Link* p) auto LinkedList::erase(Link* p) -> Link* { /* ... */ } { /* ... */ }
  • 20. std::function C++11 int sum(int a, int b) { return a + b; } function<int (int, int)> fsum = &sum; fsum(4,2);
  • 21. std::function C++11 struct Foo { void f(int i){} }; function<void(Foo&, int)> fmember = mem_fn(&Foo::f); Foo foo; fmember(foo, 42);
  • 22. std::function C++11 struct Foo { void f(int i){} }; Foo foo; function<void(int)> fmember = bind(&Foo::f, foo, _1); fmember(42);
  • 23. std::bind C++11 output float div(float a, float b){ return a/b; } cout << “6/1” << div(6,1); 6/1 = 6 cout << “6/2” << div(6,2); 6/2 = 3 cout << “6/3” << div(6,3); 6/3 = 2 function<float(float, float)> inv_div = bind(div, _2, _1); cout << “1/6” << inv_div(6,1); 1/6 = 0.166 cout << “2/6” << inv_div(6,2); 2/6 = 0.333 cout << “3/6” << inv_div(6,3); 3/6 = 0.5 function<float(float)> div_by_6 = bind(div, _1, 6); 1/6 = 0.166 cout << “1/6” << div_by_6 (1); 2/6 = 0.333 cout << “2/6” << div_by_6 (2); 3/6 = 0.5 cout << “3/6” << div_by_6 (3);
  • 24. std::bind C++11 //Practical usage linear_congruential_engine<uint64_t, 1103545, 123, 21478> generator(1127590); uniform_int_distribution<int> distribution(1,6); int rnd = distribution(generator); //Let’s make things a little bit easier: auto dice = bind( distribution, generator ); int rnd = dice()+dice()+dice();
  • 25. function objects C++11(deprecated binders C++11 and adaptors) unary_function, Function wrappers binary_function, function ptr_fun, mem_fn pointer_to_unary_function, bad_function_call pointer_to_binary_function, mem_fun, Bind mem_fun_t, bind mem_fun1_t is_bind_expression const_mem_fun_t is_placeholder const_mem_fun1_t _1, _2, _3, ... mem_fun_ref mem_fun_ref_t Reference wrappers mem_fun1_ref_t reference_wrapper const_mem_fun_ref_t ref const_mem_fun1_ref_t cref binder1st binder2nd bind1st bind2nd
  • 26. lambdas C++03 struct functor { int &a; functor(int& _a) : a(_a) { } bool operator()(int x) const { return a == x; } }; int a = 42; count_if(v.begin(), v.end(), functor(a));
  • 27. lambdas C++03 C++11 struct functor int a = 42; { count_if(v.begin(), v.end(), [&a](int x){ return int &a; x == a;}); functor(int& _a) : a(_a) { C++14 } //possible C++14 lambdas bool operator()(int x) const count_if(v.begin(),v.end(),[&a](auto x)x == a); { return a == x; http://isocpp.org/blog/2012/12/an- } implementation-of-generic-lambdas-request- }; for-feedback-faisal-vali int a = 42; count_if(v.begin(), v.end(), functor(a));
  • 28. lambdas/closures C++11 test scope lambda scope void test() { int x = 4; x=4 int y = 5; y=5 [&](){x = 2;y = 2;}(); x=2 y=2 x=2 y=2 [=]() mutable{x = 3;y = 5;}(); x=2 y=2 x=3 y=5 [=,&x]() mutable{x = 7;y = 9;}(); x=7 y=2 x=7 y=9 } void test() { int x = 4; x=4 int y = 5; y=5 auto z = [=]() mutable{x = 3;++y; int w = x + y; return w; }; //closure //x,y lives inside z z(); x=4 y=5 x=3 y=6 w=9 z(); x=4 y=5 x=3 y=7 w=10 z(); x=4 y=5 x=3 y=8 w=11 }
  • 29. recursive lambdas function<int(int)> f = [&f](int n) { return n <= 1 ? 1 : n * f(n - 1); }; int x = f(4); //x = 24
  • 30. std::tuple C++11 python tuple<int,float,string> t(1,2.f,”text”); t = (1,2.0,’text’) int x = get<0>(t); x = t[0] float y = get<1>(t); y = t[1] string z = get<2>(t); z = t[2] int myint; char mychar; tuple<int,float,char> mytuple; // packing values into tuple // packing values into tuple mytuple = make_tuple (10, 2.6, 'a'); mytuple = (10, 2.6, 'a') // unpacking tuple into variables // unpacking tuple into variables tie(myint, ignore, mychar) = mytuple; myint, _, mychar = mytuple int a = 5; a=5 int b = 6; b=6 tie(b, a) = make_tuple(a, b); b,a = a,b
  • 31. std::tuple/std::tie(for lexicographical comparison) C++03 C++11 struct Student struct Student { string name; { int classId; string name; int numPassedExams; int classId; bool operator<(const Student& rhs) const int numPassedExams; { if(name < rhs.name) bool operator<(const Student& rhs) const return true; { if(name == rhs.name) return tie(name, classId, numPassedExams) < { tie(rhs.name, rhs.classId, rhs.numPassedExams); if(classId < rhs.classId) return true; } }; if(classId == rhs.classId) return numPassedExams < rhs.numPassedExams; } set<Student> students; return false; } }; set<Student> students;
  • 32. Uniform Initialization and std::initializer_list C++03 C++11 int a[] = { 1, 2, 3, 4, 5 }; int a[] = { 1, 2, 3, 4, 5 }; vector<int> v; vector<int> v = { 1, 2, 3, 4, 5 }; for( int i = 1; i <= 5; ++i ) v.push_back(i); map<int, string> labels; map<int, string> labels { labels.insert(make_pair(1, “Open”)); { 1 , "Open" }, labels.insert(make_pair(2, “Close”)); { 2 , "Close" }, labels.insert(make_pair(3, “Reboot”)); { 3 , "Reboot" } }; Vector3 normalize(const Vector3& v) Vector3 normalize(const Vector3& v) { { float inv_len = 1.f/ length(v); float inv_len = 1.f/ length(v); return Vector3(v.x*inv_len, v.y*inv_len, v.z*inv_len); return {v.x*inv_len, v.y*inv_len, v.z*inv_len}; } } Vector3 x = normalize(Vector3(2,5,9)); Vector3 x = normalize({2,5,9}); Vector3 y(4,2,1); Vector3 y{4,2,1};
  • 33. std::initializer_list C++11 vector<int> v = { 1, 2, 3, 4, 5 }; //How to make this works? vector<int> v = { 1, 2, 3, 4, 5 }; template<class T> //vector(initializer_list<T> args) is called class vector{ vector(initializer_list<T> args) { /*rude, naive implementation to show how ctor with initiailizer_list works*/ for(auto it = begin(args); it != end(args); ++it) push_back(*it); } //… }; //what is initializer_list<T> ? initializer_list<T> is a lightweight 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;
  • 34. Uniform Initialization C++11 //but wait!!! How then does this work?? The answer is: struct Vector3{ now you can use {} instead of () float x,y,z; But what about following case: Vector3(float _x, float _y, float _z) struct T { : x(_x), y(_y), z(_z){} T(int,int); //I don’t see ctor with std::initializer_list! T(initializer_list<int>); }; }; T foo {10,20}; // calls initializer_list ctor Vector3 normalize(const Vector3& v){ T bar (10,20); // calls first constructor float inv_len = 1.f/ length(v); return {v.x*inv_len, v.y*inv_len, v.z*inv_len}; Initializer-list constructors take precedence over other } constructors when the initializer-list constructor syntax is used! Vector3 x = normalize({2,5,9}); So, be careful! Consider following example: Vector3 y{4,2,1}; vector<int> v(5); // v contains five elements {0,0,0,0,0} vector<int> v{5}; // v contains one element {5}
  • 35. Uniform Initialization C++11 Uniform initialization solves many problems: Narrowing int x = 6.3; //warning! int y {6.3}; //error: narrowing int z = {6.3}; //error: narrowing vector<int> v = { 1, 4.3, 4, 0.6 }; //error: double to int narrowing “The most vexing parse” problem struct B{ struct B{ B(){} B(){} }; }; struct A{ struct A{ A(B){} A(B){} void f(){} void f(){} }; }; int main(){ int main(){ A a(B()); //this is function declaration! A a{B()}; //calls B ctor, then A ctor. Everything is ok. a.f(); //compile error! a.f(); //calls A::f return 0; return 0; } }
  • 36. Uniform Initialization and std::initializer_list // Don’t mix std::initializer_list with auto int n; auto w(n); // int auto x = n; // int auto y {n}; // std::initializer_list<int> auto z = {n}; // std::initializer_list<int>
  • 37. using C++03 typedef int int32_t; // on windows typedef void (*Fn)(double); template <int U, int V> class Type; typedef Type<42,36> ConcreteType; template<int V> template<int V> typedef Type<42,V> MyType; struct meta_type{ //error: not legal C++ code typedef Type<42, V> type; }; MyType<36> object; typedef meta_type<36>::type MyType; MyType object;
  • 38. using C++03 C++11 typedef int int32_t; // on windows using int32_t = int; // on windows typedef void (*Fn)(double); using Fn = void (*)(double); template <int U, int V> class Type; template <int U, int V> class Type; typedef Type<42,36> ConcreteType; using ConcreteType = Type<42,36>; template<int V> template <int V> struct meta_type{ using MyType = Type<42, V>; typedef Type<42, V> type; }; typedef meta_type<36>::type MyType; MyType object; MyType<36> object;
  • 39. explicit conversion operators C++03 struct A { A(int){}; }; void f(A){}; int main(){ A a(1); f(1); //silent implicit cast! return 0; }
  • 40. explicit conversion operators C++03 struct A {explicit A(int){}; }; void f(A){}; int main(){ A a(1); f(1); //error: implicit cast! return 0; }
  • 41. explicit conversion operators C++03 C++11 struct A { struct A { A(int) {} A(int) {} }; }; struct B { struct B { int m; int m; B(int x) : m(x) {} B(int x) : m(x) {} operator A() { return A(m); } explicit operator A() { return A(m); } }; }; void f(A){} void f(A){} int main(){ int main(){ B b(1); B b(1); A a = b; //silent implicit cast! A a = b; //error: implicit cast! f(b); //silent implicit cast! f(b); //error: implicit cast! return 0; return 0; } }
  • 42. explicit conversion operators C++03 C++11 struct A { struct A { A(int) {} A(int) {} }; }; struct B { struct B { int m; int m; B(int x) : m(x) {} B(int x) : m(x) {} operator A() { return A(m); } explicit operator A() { return A(m); } }; }; void f(A){} void f(A){} int main(){ int main(){ B b(1); B b(1); A a = b; //silent implicit cast! A a = static_cast<A>(b); f(b); //silent implicit cast! f(static_cast<A>(b)); return 0; return 0; } }
  • 43. control of defaults: default and delete C++11 class A { A& operator=(A) = delete; // disallow copying A(const A&) = delete; }; struct B { B(float); // can initialize with a float B(long) = delete; // but not with long }; struct C { virtual ~C() = default; };
  • 44. enum class - scoped and strongly typed enums C++03 C++11 enum Alert { green, yellow, red }; enum class Alert { green, yellow, red }; //enum Color{ red, blue }; enum class Color : int{ red, blue }; //error C2365: 'red' : redefinition Alert a = 7; // error (as ever in C++) Alert a = 7; // error (as ever in C++) Color c = 7; // error: no int->Color conversion int a2 = red; // ok: Alert->int conversion int a2 = red; // error int a3 = Alert::red; // error int a3 = Alert::red; //error int a4 = blue; // error: blue not in scope int a5 = Color::blue; //error: not Color->int conversion Color a6 = Color::blue; //ok
  • 45. user-defined literals C++03 C++11 123 // int 1.2_i // imaginary 1.2 // double 123.4567891234_df // decimal floating point (IBM) 1.2F // float 101010111000101_b // binary 'a' // char 123_s // seconds 1ULL // unsigned long long 123.56_km // not miles! (units) Speed v = 100_km/1_h; int operator "" _km(int val){ return val; } Practical usage: http://www.codeproject.com/Articles/447922/Applic ation-of-Cplusplus11-User-Defined-Literals-t
  • 46. Move Semantics C++03 typedef vector<float> Matrix; //requires already created C void Mul(const Matrix& A, const Matrix& B, Matrix& C); //need to manage lifetime manually using new/delete void Mul(const Matrix& A, const Matrix& B, Matrix* C); //please, don’t forget to call delete Matrix* operator*(const Matrix& A, const Matrix& B); //no need to manage lifetime manually, but adds some //performance and abstraction penalty shared_ptr<Matrix> operator* (const Matrix& A, const Matrix& B);
  • 47. Move Semantics C++03 C++11 typedef vector<float> Matrix; typedef vector<float> Matrix; //requires already created C void Mul(const Matrix& A, const Matrix& B, Matrix& C); //need to manage lifetime manually using new/delete void Mul(const Matrix& A, const Matrix& B, Matrix* C); //Cool syntax, no abstraction or performance //please, don’t forget to call delete //penalty! Thanks to move semantics! Matrix* operator*(const Matrix& A, const Matrix& B); Matrix operator*(const Matrix& A, const Matrix& B); //no need to manage lifetime manually, but adds some //performance and abstraction penalty shared_ptr<Matrix> operator* (const Matrix& A, const Matrix& B); Matrix A(10000); Matrix B(10000); Matrix C = A * B;
  • 48. Move Semantics C++11 typedef vector<float> Matrix; template<class T> class vector Matrix operator*(const Matrix& A, const Matrix& B); { { T* data; Matrix ret(A.size()); //ret.data = 0x0028fabc size_t size; //ret.size = 100000 //matrix multiplication algorithm public: // vector(vector<T>&& rhs) return ret; //vector<float>(vector<float>&&) : data(rhs.data) //C.data = ret.data, C.size = ret.size , size(rhs.size) //ret.data = nullptr, ret.size = 0 { }//~vector<float>() rhs.data = nullptr; //delete ret.data; //”delete nullptr;” is ok. rhs.size = 0; } Matrix A(10000); ~vector() Matrix B(10000); { Matrix C = A * B; delete[] data; } //C.data = 0x0028fabc //… //C.size = 100000 };
  • 49. Move Semantics C++03 C++11 typedef vector<float> BigObj; typedef vector<float> BigObj; void f(BigObj&); //reference to lvalue void f(BigObj&&); //reference to rvalue void f(BigObj&); //reference to lvalue //test1 //test1 BigObj x = createBigObject(); //BigObj(const BigObj&) BigObj x = createBigObject(); f(x); //BigObj(const BigObj&) f(x); //BigObj(const BigObj&) f(createBigObject()); //BigObj(const BigObj&) f(createBigObject()); //BigObj(BigObj&&) //test2 BigObj x = createBigObject(); f(move(x)); // move makes from input value – rvalue. //test3 //test3 BigObj createBigObject() BigObj createBigObject() { { BigObj object(100000); //value BigObj object(100000); //prvalue return object; //BigObj(const BigObj&) return object; //BigObj(BigObj&&) }//~BigObj }//~BigObj BigObj x = createBigObject(); BigObj x = createBigObject();
  • 50. constexpr C++03 C++11 template<int N> constexpr int Fib(int n) struct Fib{ { enum { return n<=2 ? 1 : Fib(n-1)+Fib(n-2); value = Fib<N-1>::value + Fib<N-2>::value } }; }; cout << Fib(15); //compile time template<> struct Fib<1>{ int a = 15; enum { value = 1 }; cout << Fib(a); //runtime }; template<> struct Fib<0> { enum { value = 0 }; }; cout << Fib<15>::value;
  • 51. range-for, begin, end C++03 C++11 vector<int> v; vector<int> v; for( vector<int>::iterator i = v.begin(); i != for( auto d : v ) v.end(); ++i ) total += d; total += *i; sort( v.begin(), v.end() ); sort( begin(v), end(v) ); int a[] = {1,2,3,4,5}; int a[] = {1,2,3,4,5}; sort( &a[0], &a[0] + sizeof(a)/sizeof(a[0])); sort( begin(a), end(a) );
  • 52. Memory management (unique_ptr is safe replacement for unsafe deprecated auto_ptr) C++11 unique_ptr<int> p1(new int(42)); unique_ptr<int> p2 = p1; //Compile error. Only “move” operation is possible. unique_ptr<int> p3 = move(p1); //Transfers ownership. p3 now owns the memory and p1 is nullptr. p3.reset(); //Deletes the memory. p1.reset(); //Does nothing. unique_ptr<int> createUniqueResource() { unique_ptr<int> ret( new int(42) ); return ret; //no need to move(ret); } F* OpenFile(char* name); void CloseFile(F*); /* custom deleter */ unique_ptr<F, function<decltype(CloseFile)>> file(OpenFile("text"), CloseFile); file->read(1024);
  • 53. Memory management (shared_ptr = ref(+weak) thread safe void test() counter) { shared_ptr<int> p( new int(42) ); ref count = 1, weak count = 0 { shared_ptr<int> x = p; ref count = 2, weak count = 0 { shared_ptr<int> y = p; ref count = 3, weak count = 0 } ref count = 2, weak count = 0 } ref count = 1, weak count = 0 // use weak_ptr to break reference-count cycles weak_ptr<int> wp = p; ref count = 1, weak count = 1 – note ref count is still 1 shared_ptr<int> ap = wp.lock(); ref count = 2, weak count = 1 { shared_ptr<int> y = ap; ref count = 3, weak count = 1 } ref count = 2, weak count = 1 } ap dtor: ref count = 1, weak count = 1 wp dtor: ref count = 1, weak count = 0 p dtor: ref count = 0, weak count = 0 - destroy p!
  • 54. Variadic templates C++03 C++11 void f(); template <class ...T> template<class T> void f(T... args); void f(T arg1); template<class T, class U> void f(T arg1, U arg2); template<class T, class U, class Y> void f(T arg1, U arg2, Y arg3); template<class T, class U, class Y, class Z> void f(T arg1, U arg2, Y arg3, Z arg4); f(“test”,42,’s’,12.f); f(“test”,42,’s’,12.f); //… till some max N.
  • 55. Variadic templates C++11 C++11(call sequence) template<class T> print_list(first = 42, ...rest = "hello",2.3,'a') void print_list(T value) 42 { print_list(first = "hello", ...rest = 2.3,'a') cout<<value<<endl; hello } print_list(first = 2.3, ...rest = 'a') 2.3 template<class First, class ...Rest> print_list(value ='a') //trivial case void print_list(First first, Rest ...rest) a { cout<<first<<","; print_list(rest...); } Output print_list(42,"hello",2.3,'a'); 42,hello,2.3,a
  • 56. Tuple definition using variadic templates C++11 template<class... Elements> “LISP-style” definition: class tuple; A tuple is either: template<> - An empty tuple, or class tuple<> {}; template<class Head, class... Tail> - A pair (head, tail) where head is class tuple<Head, Tail...> : private tuple<Tail...> the first element of the tuple and { tail is a tuple containing the rest(…) Head head; of the elements. // };
  • 57. Variadic templates C++11 Haskell template<int... Elements> struct count; count [] = 0 count (T:Args) = 1 + count Args template<> struct count<> { static const int value = 0; //call }; count [0,1,2,3,4] template<int T, int... Args> struct count<T, Args...> { static const int value = 1 + count<Args...>::value; }; //call int x = count<0,1,2,3,4>::value;
  • 58. Variadic templates(sizeof... operator) C++11 template<int... Elements> struct count; template<int... Elements> struct count template<> struct count<> { { static const int value = sizeof...(Elements); static const int value = 0; }; }; /* template<int T, int... Args> sizeof...() – return the number elements in struct count<T, Args...> a parameter pack { */ static const int value = 1 + count<Args...>::value; //call }; int x = count<0,1,2,3,4>::value; //call int x = count<0,1,2,3,4>::value;
  • 59. std::string Interprets a signed integer value in the string: int stoi( const std::string& str, size_t *pos = 0, int base = 10 ); long stol( const std::string& str, size_t *pos = 0, int base = 10 ); long long stoll( const std::string& str, size_t *pos = 0, int base = 10 ); Interprets an unsigned integer value in the string: unsigned long stoul( const std::string& str, size_t *pos = 0, int base = 10 ); unsigned long long stoull( const std::string& str, size_t *pos = 0, int base = 10 ); Interprets a floating point value in a string: float stof( const std::string& str, size_t *pos = 0 ); double stod( const std::string& str, size_t *pos = 0 ); long double stold( const std::string& str, size_t *pos = 0 ); Converts a (un)signed/decimal integer to a string/wstring: to_string to_wstring
  • 60. std::array C++03 C++11 char arr1[] = "xyz"; //'0' is added to the end array<char, 3> arr1 = {'x', 'y', 'z'}; int arr2[] = {2112, 90125, 1928}; array<int, 3> arr2 = {2112, 90125, 1928}; int* x = arr2; //ok int* x = arr2; //error x = arr2.data(); //ok cout << sizeof(arr1) - 1 << endl; cout << arr1.size() << endl; cout << sizeof(arr2) / sizeof(int) << endl; cout << arr2.size() << endl; arr2[-42] = 36; //oops arr2.at(-42) = 36; //throws std::out_of_range exception http://stackoverflow.com/questions/6111565/now-that-we-have-stdarray-what-uses-are-left-for-c- style-arrays
  • 61. std::vector C++03 C++11 void c_style_f(int* x){} void c_style_f(int* x){} void test(){ void test(){ vector<int> v; vector<int> v; if(!v.empty()) c_style_f(v.data()); c_style_f(&v[0]); } if(!v.empty()) c_style_f(&v.front()); if(!v.empty()) c_style_f(&*v.begin()); } vector<int> v; vector<int> v; v.push_back( 1 ); //capacity = 1 v.push_back( 1 ); //capacity = 1 v.reserve( 20 ); //capacity = 20 v.reserve( 20 ); //capacity = 20 vector<int>(v).swap(v); //capacity = 1 v.shrink_to_fit(); //capacity = 1 //very intuitive! struct Some_type{ struct Some_type{ Some_type(int _x, int _y, int _z) : x(_x), y(_y), z(_z){} Some_type(int _x, int _y, int _z) : x(_x), y(_y), z(_z){} int x,y,z; int x,y,z; }; }; vector<Some_type> v; vector<Some_type> v; v.push_back(Some_type(1,2,3)); v.emplace_back(1,2,3);
  • 62. STL std::regex bool equals = regex_match("subject", regex("(sub)(.*)") ); std::chrono auto start = high_resolution_clock::now(); some_long_computations(); auto end = high_resolution_clock::now(); cout<<duration_cast<milliseconds>(end-start).count(); std::ratio using sum = ratio_add<ratio<1,2>, ratio<2,3>>; cout << "sum = " << sum::num << "/" << sum::den; cout << " (which is: " << ( double(sum::num) / sum::den ) << ")" << endl; Output: sum = 7/6 (which is: 1.166667)
  • 63. STL New algorithms: std::all_of, std::none_of, std::any_of, std::find_if_not, std::copy_if, std::copy_n, std::move, std::move_n, std::move_backward, std::shuffle, std::random_shuffle, std::is_partitioned, std::partition_copy, std::partition_point, std::is_sorted, std::is_sorted_until, std::is_heap_until, std::min_max, std::minmax_element, std::is_permutation, std::iota
  • 64. Threads and memory model Threading support: thread, mutex, condition variable, future/promise, package task Memory model: atomic, fence Difference between std::thread and boost::thread: http://stackoverflow.com/questions/7241993/is-it-smart-to-replace-boostthread-and-boostmutex-with- c11-equivalents
  • 65. std::thread C++11 Java #include <thread> public class TestThread { #include <iostream> public static void main(String[] args) throws int main() InterruptedException { { Thread t1 = new Thread(new Runnable() { using namespace std; public void run() { thread t1([](){ System.out.println(“Hi from thread"); cout << “Hi from } thread” << endl;}); }); t1.start(); t1.join(); t1.join(); return 0; } } }
  • 66. std::mutex C++11 Output(may vary) #include <iostream> 1: 0 #include <thread> //version without mutex!!! 1: 1 using namespace std; 1: 2 void run(size_t n){ 1: 3 for (size_t i = 0; i < 5; ++i){ 1: 4 cout << n << ": " << i << endl; } 23: 0 } 3: 1 int main(){ 3: 2 thread t1(run, 1); 3: 3 thread t2(run, 2); thread t3(run, 3); 3: 4 t1.join(); :0 t2.join(); 2: 1 t3.join(); 2: 2 return 0; 2: 3 } 2: 4
  • 67. std::mutex C++11 Output(is defined within run) #include <iostream> #include <thread> 1: 0 #include <mutex> 1: 1 using namespace std; 1: 2 mutex m; 1: 3 1: 4 void run(size_t n){ m.lock(); 2: 0 for (size_t i = 0; i < 5; ++i){ 2: 1 cout << n << ": " << i << endl; } 2: 2 m.unlock(); 2: 3 } 2: 4 int main(){ 3: 0 thread t1(run, 1); thread t2(run, 2); 3: 1 thread t3(run, 3); 3: 2 t1.join(); 3: 3 t2.join(); 3: 4 t3.join(); return 0; }
  • 68. std::lock_guard+std::mutex C++11 #include <iostream> #include <iostream> #include <thread> #include <thread> #include <mutex> #include <mutex> using namespace std; using namespace std; mutex m; mutex m; void run(size_t n){ void run(size_t n){ m.lock(); lock_guard<mutex> lm(m); //ctor – m.lock(), dtor – m.unlock() for (size_t i = 0; i < 5; ++i){ for (size_t i = 0; i < 5; ++i){ cout << n << ": " << i << endl; cout << n << ": " << i << endl; } } } m.unlock(); } int main(){ thread t1(run, 1); int main(){ thread t2(run, 2); thread t1(run, 1); thread t3(run, 3); thread t2(run, 2); thread t3(run, 3); t1.join(); t2.join(); t1.join(); t3.join(); t2.join(); t3.join(); return 0; } return 0; }
  • 69. std::async C++11 #include <iostream> #include <future> using namespace std; int Fib(int n){ return n<=2 ? 1 : Fib(n-1)+Fib(n-2); } int calc1(){ return Fib(30); } int calc2(){ return Fib(40); } int main() { // start calc1() asynchronously future<int> result1 = async(calc1); // call calc2() synchronously int result2 = calc2(); // wait for calc1() and add its result to result2 int result = result1.get() + result2; cout << "calc1()+calc2(): " << result << endl; return 0; }
  • 70. Deprecated idioms C++11 Now that we have C++11, we can use new features instead of following idioms: nullptr Move_Constructor Safe_bool Shrink-to-fit Type_Safe_Enum Requiring_or_Prohibiting_Heap-based_Objects Type_Generator Final_Class address_of http://stackoverflow.com/questions/9299101/what-c-idioms-are-deprecated-in-c11
  • 71. C++11 compiler support gcc icc msvc(with NOV CTP) Ibm xlc clang 38/39 27/39 24/39 17/39 37/39 Not implemented: Full STL Full STL Not Full STL threads, regex support support(without init. implemented: support list) threads, regex