标签:c++11
template<class T > void printall(const vector< T>& v){// 根据v.begin()的返回值类型自动推断p的数据类型for ( auto p = v.begin(); p != v.end(); ++p)cout << *p << “n”;}
enum class Color : char { red , blue }; // 紧凑型表示(一个字节)enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; // C11中我们可以指定枚举值的底层数据类型大小
enum class Color_code : char ; // (前向) 声明void foobar(Color_code * p); // 使用// ...// 定义enum class Color_code : char { red , yellow , green , blue };
需要注意的是,constexpr并不是const的通用版,反之亦然:
void f(const vector<int>& a, vector<float>& b){// 推断表达式a[0]*b[0]的数据类型,并将其定义为Temp类型typedef decltype( a[0] * b[0]) Tmp;// 使用Tmp作为数据类型声明变量,创建对象
for ( int i = 0; i < b.size(); ++i) {Tmp* p = new Tmp( a[i] * b[i]);// …}// …}
class X {// …
X& operator=( const X&) = delete; // 禁用类的赋值操作符X( const X&) = delete;};
class Y {// …// 使用默认的赋值操作符和复制构造函数Y& operator=( const Y&) = default; // 默认的复制操作Y( const Y&) = default;};
struct Z {// …
Z( long long); // 可以通过long long初始化// 但是不能使用更短的long进行初始化,// 也就不是不允许long到long long的隐式转型(感谢abel)Z( long) = delete;};
class X {int a;public:X( int x) { if (0< x && x <= max) a = x; else throw bad_X( x); }// 构造函数X()调用构造函数X(int x)X() : X{ 42 } { }// 构造函数X(string s)调用构造函数X(int x)X(string s) : X{ lexical_cast< int>(s) } { } // lexical_cast 是boost库中的万能转化函数// …};
void f(const vector& v){for ( auto x : v) cout << x << ‘n’;for ( auto& x : v) ++x; // 使用引用,方便我们修改容器中的数据}
template<class T, class U>? ? ? mul(T x, U y){return x*y;}
template<class T, class U>auto mul(T x, U y) -> decltype (x*y){return x*y;}
struct List{struct Link{/* ... */};Link* erase( Link* p);};
List::Link * List ::erase(Link *p ){/* ... */}
auto List ::erase(Link * p ) -> Link *{/* ... */}
class A {public:int a = 7;};
class A {public:int a;A() : a(7) {}};
class A {public:A() {}A( int a_val) : a( a_val) {} // 优先级高
int a = 7;int b = 5;};
template<class E > class vector {public:// 初始化列表构造函数vector( std::initializer_list<E > s ){// 预留出合适的容量reserve(s .size()); //// 初始化所有元素uninitialized_copy(s .begin(), s.end(), elem);sz = s. size(); // 设置容器的size}// ... 其他部分保持不变 ...};// ...vector<double > v1 (7); // OK: v1有7个元素vector<double > v2 { 7, 9 }; // OK: v2有2个元素,其值为7.0和9.0v1 = 9; // Err: 无法将int转换为vectorvector<double > v3 = 9; // Err: 无法将int转换为vectorv1 = { 7, 9 }; // OK: v1有2个元素,其值为7.0和9.0
template <class T >void printAll (initializer_list<T> args){for ( auto & item : args)cout << item << endl;}printAll({ 0, 1, 2, 3, 4, 5, 6 });printAll({ "asdf", "adadf" , "234" });
上述命名空间Mine中同时包含了较新的版本(V99)以及早期的版本(V98),如果你需要显式使用(某个版本的函数),你可以:// 文件:V99.hinline namespace V99 {void f( int); // 对V98版本进行改进void f( double); // 新特性// …}// 文件:V98.hnamespace V98 {void f( int); // V98版本只实现基本功能// …}// 文件:Mine.hnamespace Mine {#include “V99.h”#include “V98.h”}
此处的要点在于,被inline修饰的内联命名空间,其内部所包含的所有类/函数/变量等声明,看起来就好像是直接在外围的命名空间中进行声明的一样。#include “Mine.h”using namespace Mine ;// …V98::f (1); // 早期版本V99::f (1); // 较新版本f(1); // 默认版本(V99)
#include <vector>#include<algorithm> // for_eachusing namespace std;class CTest{public:CTest() : m_nData(20) { NULL; }void TestLambda(){vector<int > vctTemp ;vctTemp. push_back(1);vctTemp. push_back(2);
// 无函数对象参数,输出:1 2{for_each(vctTemp .begin(), vctTemp.end(), []( int v){ cout << v << endl; });}
// 以值方式传递作用域内所有可见的局部变量(包括this),输出:11 12{int a = 10;for_each(vctTemp .begin(), vctTemp.end(), [=]( int v){ cout << v + a << endl; });}
// 以引用方式传递作用域内所有可见的局部变量(包括this),输出:11 13 12{int a = 10;for_each(vctTemp .begin(), vctTemp.end(), [&]( int v) mutable{ cout << v + a << endl; a++; });cout << a << endl;}
// 以值方式传递局部变量a,输出:11 13 10{int a = 10;for_each(vctTemp .begin(), vctTemp.end(), [ a]( int v) mutable{ cout << v + a << endl; a++; });cout << a << endl;}
// 以引用方式传递局部变量a,输出:11 13 12{int a = 10;for_each(vctTemp .begin(), vctTemp.end(), [& a]( int v){ cout << v + a << endl; a++; });cout << a << endl;}
// 传递this,输出:21 22{for_each(vctTemp .begin(), vctTemp.end(), [ this]( int v){ cout << v + m_nData << endl; });}
// 除b按引用传递外,其他均按值传递,输出:11 12 17{int a = 10;int b = 15;for_each(vctTemp .begin(), vctTemp.end(), [=, & b]( int v){ cout << v + a << endl; b++; });cout << b << endl;}
// 操作符重载函数参数按引用传递,输出:2 3{for_each(vctTemp .begin(), vctTemp.end(), []( int & v){ v++; });for_each(vctTemp .begin(), vctTemp.end(), []( int v){ cout << v << endl; });}
// 空的Lambda表达式{[](){}();[]{}();}}
private:int m_nData;};
void f (vector<X>& v){struct Less {bool operator()( const X& a, const X& b){return a. v < b. v;}};// C++98: 错误: Less是局部类// C++11: 正确sort(v .begin(), v.end(), Less());}
void f (vector<X>& v){sort(v .begin(), v.end(),[]( const X& a, const X& b) { return a. v < b. v; });}
template<typename T > void foo (T const & t ){}enum X { x };enum { y };
int main (){foo( x); // C++98: ok; C++11: ok//(译注:y是未命名类型的值,C++98无法从这样的值中推断出函数模板参数)foo( y); // C++98: error; C++11: okenum Z { z };foo( z); // C++98: error; C++11: ok//(译注:C++98不支持从局部类型值推导模板参数}
int x0 { 7.3 }; // 编译错误: 窄转换int x1 = { 7.3 }; // 编译错误:窄转换double d = 7;int x2 { d }; // 编译错误:窄转换(double类型转化为int类型)char x3 { 7 }; // OK:虽然7是一个int类型,但这不是窄转换vector vi = { 1, 2.3, 4, 5.6 }; //错误:double至int到窄转换
struct B {virtual void f();virtual void g() const;virtual void h( char);void k(); // non-virtual};struct D : B {void f() override; // OK: 重写 B::f()void g() override; // error: 不同的函数声明,不能重写virtual void h( char); // 重写 B::h( char ); 可能会有警告void k() override; // error: B::k() 不是虚函数};
原生字符串标识struct B {virtual void f() const final; // 禁止重写virtual void g();};
struct D : B {void f() const; // 编译错误: D::f()不能对声明为final的B::f()进行重写void g(); // OK};
// 这个字符串是 “quoted string”string str1 = R "("quoted string")"
// 字符串为:"quoted string containing the usual terminator (")"string str2 = R "***("quoted string containing the usual terminator (")")***"
int a ;int f (){return 1;}
int& r1 = a ; // 将r1绑定到a(一个左值)int& r2 = f (); // 错误:f()的返回值是右值,无法绑定int&& rr1 = f(); // OK:将rr1绑定到临时变量。这样效率高,比int rr1 = f() 少了一次拷贝构造的时间。int&& rr2 = a; // 错误:不能将右值引用rr2绑定到左值a
template <class T >void swap(T & a, T& b) //“完美swap”(大多数情况下){T tmp = move(a ); // 变量a现在失效(译注:内部数据被move到tmp中了)a = move(b ); // 变量b现在失效(译注:内部数据被move到a中了,变量a现在“满血复活”了)b = move(tmp); // 变量tmp现在失效(译注:内部数据被move到b中了,变量b现在“满血复活”了)}
static_assert(sizeof (long ) >= 8, "64 - bit code generation required for this library.");
int f (int * p, int n){//错误:表达式“p == 0”不是一个常量表达式static_assert(p == 0, "p is not null" );}
标签:c++11
原文地址:http://blog.csdn.net/yangdm0209/article/details/40649863