注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

c++11和c++14  

2016-10-12 11:35:24|  分类: language |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

0. 右值引用

class widget {
};
int main() {
widget w;
widget&& w1 = w;

widget& w2 = w;

}

test_move.cpp: 在函数‘int main()’中:
test_move.cpp:25:19: 错误:无法将左值‘widget’绑定到‘widget&&’
widget&& w1 = w;


#include<iostream>
#include<boost/type_index.hpp>

using boost::typeindex::type_id_with_cvr;
class widget {
};

void func(widget&& parm) {
std::cout << type_id_with_cvr<decltype(parm)>().pretty_name() << std::endl;
}

int main() {
widget w;
//widget&& w1 = w;
widget& w2 = w;
func(w);//w为左值,不能bind到右值引用
func(w2);//w2为左值引用,也不能bind到右值引用
}

test_move.cpp: In function 'int main()':
test_move.cpp:16:11: error: cannot bind 'widget' lvalue to 'widget&&'
func(w);
^
test_move.cpp:8:6: note: initializing argument 1 of 'void func(widget&&)'
void func(widget&& parm) {
^
test_move.cpp:17:12: error: cannot bind 'widget' lvalue to 'widget&&'
func(w2);
^
test_move.cpp:8:6: note: initializing argument 1 of 'void func(widget&&)'
void func(widget&& parm) {


1. noexcept关键字
voidFunc0() throw(runtime_error);
voidFunc1() throw();
voidFunc2();
如果被声明为noexcept的函数抛出了异常,则会被std::terminate终止进程

2. using
创建别名
using type = future<T>

3. unique_ptr
template <class T, class D= default_delete<T>> class unique_ptr;
template <class T, class D> class unique_ptr<T[], D>;
1. a stored pointer: 管理的对象指针,可以在construction的时候设置,也可以通过operator=或者reset来改变
2. a stored deleter: 一个被调用的对象,使用stored pointer类型作为参数
std::unique_ptr<int> u1; //ok
std::unique_ptr<int> u2(nullptr); //ok
std::unique_ptr<int> u3(new int); //ok

move assignment:
unique_ptr& operator= (unique_ptr&& x) noexcept;
u1 = std::move(u3);  //ok, u3变为nullptr, u1则非null

copy assignment
u2 = u1; //error, copy assigment被禁止
unique_ptr& operator= (const unique_ptr&) = delete;


nullptr赋值

unique_ptr& operator= (nullptr_t) noexcept;
u1 = nullptr;//succ

4. remove_reference
template< class T >
struct remove_reference;

template< class T >
using remove_reference_t = typename remove_reference<T>::type
template< class T > struct remove_reference      {typedef T type;};
template< class T > struct remove_reference<T&>  {typedef T type;};
template< class T > struct remove_reference<T&&> {typedef T type;};

reomove_reference 非常有意思,做得事情也非常有限,只是把提取传进来的参数的原来的类型,
比如如果是左值引用,就去除左值引用,如果是右值引用,去除右值引用

5. move constructor

6. move assignment

7. std::make_unique
//(only for non-array types)
template< class T, class... Args >
unique_ptr<T> make_unique( Args&&... args );
//for array types
template< class T >
unique_ptr<T> make_unique( std::size_t size );

unique_ptr<T>(new T(std::forward<Args>(args)...))// 非数组实现
unique_ptr<T>(new typename std::remove_extent<T>::type[size]())//数组实现
args 用于T的构造函数构造对象调用
size: 用于数组构造使用

class Person {

public:

Person(std::string name):_name(name) {}

private:

std::string _name;

};

auto v1 = std::make_unique<Person>("zhangsan");

8. std::shared_ptr
constexpr shared_ptr() noexcept;
constexpr shared_ptr(nullptr_t) : shared_ptr() {} //from nullptr
template <class U> explicit shared_ptr (U* p);//from pointer
template <class U, class D> shared_ptr (U* p, D del);
shared_ptr (shared_ptr&& x) noexcept
template <class U> shared_ptr (shared_ptr<U>&& x) noexcept;

int main() {
std::shared_ptr<int> p1;
std::shared_ptr<int> p2(nullptr);
std::shared_ptr<int> p3(new int(888));
std::shared_ptr<int> p31(new int(999));
//p4 will shard p3's data pointer, and increase use count
std::shared_ptr<int> p4(p3);
//p3 becomes an empty object, p5 acquire data pointer
std::shared_ptr<int> p5(std::move(p31));

// shared_ptr support * to dereference
std::cout << "p3:" << *p3 << std::endl;
std::cout << "p4:" << *p4 << std::endl;
std::cout << "p4:" << *p5 << std::endl;
}


p3:888
p4:888
p4:999


9. std::tuple
template< class... Types >
class tuple;

//constructor
explicit tuple( const Types&... args );
std::tuple<int, std::string> t1(26, "liudong");

//copy constructor
template< class... UTypes >
tuple( const tuple<UTypes...>& other );



//move constructor
template <class... UTypes>
tuple( tuple<UTypes...>&& other );



10. std::move
std::move只是类型转换,将其转化为右值引用
11. std::forward
std::forward只是类型转换,将由右值引用赋值的universal reference参数转化为右值引用

12. constexpr关键字
The de >constexprde> specifier declares that it is possible to evaluate the value of the function or variable at compile time.
 Such variables and functions can then be used where only compile time constant expressions are allowed 

13. std::make_tuple
template< class... Types >
tuple<VTypes...> make_tuple( Types&&... args );
返回一个std::tuple元组


Creates a tuple object, deducing the target type from the types of arguments.

Creates a tuple object, deducing the target type from the types of arguments.
auto t5 = std::make_tuple(18, "liuli");

14. std::function
template< class R, class... Args >
class function<R(Args...)>
R: result type
Args: argument type

void print(string& s) {
}

std::function<void(string&)> dispaly_f = print;
display_f("hello");

15. 模板推导
a. 函数根据 传进来的参数进行推导,如果参数中没有包含,则必须在调用的时候在<>中说明

template <typename T, typename Output>
inline
void write_arithmetic_type(Output& out, T v) {
static_assert(std::is_arithmetic<T>::value, "must be arithmetic type");
return out.write(reinterpret_cast<const char*>(&v), sizeof(T));
}

write_arithmetic_type(out, uint32_t(v.size()));//所有的模板类型都通过入参进行推导

template <typename T, typename Input>


inline
T read_arithmetic_type(Input& in) {
static_assert(std::is_arithmetic<T>::value, "must be arithmetic type");
T v;
in.read(reinterpret_cast<char*>(&v), sizeof(T));
return v;
}

template <typename Input>
inline sstring read(Serializer, Input& in, rpc::type<sstring>) {
auto size = read_arithmetic_type<uint32_t>(in); // input通过入参进行推导, T通过<>推导
sstring ret(sstring::initialized_later(), size);
in.read(ret.begin(), size);
return ret;
}



  评论这张
 
阅读(145)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018