当前位置: 首页 > news >正文

郑州十大网站建设公司免费自己怎么注册网站

郑州十大网站建设公司,免费自己怎么注册网站,那家公司做网站,如何配置 网站二级域名move语义最原始的左值和右值定义可以追溯到C语言时代#xff0c;左值是可以出现在赋值符的左边和右边#xff0c;然而右值只能出现在赋值符的右边。在C 里#xff0c;这种方法作为初步判断左值或右值还是可以的#xff0c;但不只是那么准确了。你要说C 中的右值到底是什么左值是可以出现在赋值符的左边和右边然而右值只能出现在赋值符的右边。在C 里这种方法作为初步判断左值或右值还是可以的但不只是那么准确了。你要说C 中的右值到底是什么这真的很难给出一个确切的定义。你可以对某个值进行取地址运算如果不能得到地址那么可以认为这是个右值。例如int foo();foo() 3; //ok, foo() is an lvalue int bar();int a bar(); // ok, bar() is an rvalue为什么要move语义呢它可以让你写出更高效的代码。看下面代码string foo();string name(jack);name  foo();第三句赋值会调用string的赋值操作符函数发生了以下事情首先要销毁name的字符串吧把foo()返回的临时字符串拷贝到name吧最后还要销毁foo()返回的临时字符串吧这就显得很不高效在C 11之前你要些的高效点可以是swap交换资源。C 11的move语义就是要做这事这时重载move赋值操作符string string::operator(string rhs);move语义不仅仅用于右值也用于左值。标准库提供了std::move方法将左值转换成右值。因此对于swap函数我们可以这样实现templatevoid swap(T a, T b){    T temp(std::move(a));    a  std::move(b);    b  std::move(temp);}右值引用string 这个类型就是所谓的右值引用而把T称之为左值引用。注意不要见到T就认为是右值引用例如下面这个就不是右值引用T foo  T(); //右值引用auto bar  foo; // 不是右值引用实际上T有两种含义一种就是常见的右值引用另一种是即可以是右值引用也可以是左值引用Scott Meyers把这种称为Universal Reference后来C 委员把这个改成forwarding reference,毕竟forwarding reference只在某些特定上下文才出现。有了右值引用C 11增加了move构造和move赋值。考虑这个情况void foo(X x){  // ...}那么问题来了x的类型是右值引用指向一个右值但x本身是左值还是右值呢C 11对此做出了区分Things that are declared as rvalue reference can be lvalues or rvalues. The distinguishing criterion is: if it has a name, then it is an lvalue. Otherwise, it is an rvalue.由此可知x是个左值。考虑到派生类的move构造我们因这样写才正确Derived(Derived rhs):base(std::move(rhs) //std::move不可缺{ ... }有一点必须明白那就是std::move不管接受的参数是lvalue,还是rvalue都返回rvalue。因此我们可以给出std::move的实现如下很接近于标准实现template typename remove_reference::type move(T t) {    using RRefType  typename remove_reference::type;    return static_cast(t);}完美转发假设有一个函数foo,我们写出如下函数把接受到的参数转发给footemplatevoid fwd(TYPE t){    foo(t);}我们一个个来分析如果TYPE是T的话假设foo的参数引用类型我会修改传进来的参数那么fwd(t)和foo(t)将导致不一样的效果。如果TYPE是T的话那么fwd传一个右值进来没法接受编译出错。如果TYPE是T而且重载个const T来接受右值看似可以但如果多个参数呢你得来个排列组合的重载因此是不通用的做法。你很难找到一个好方法来实现它右值引用的引入解决了这个问题在这种上下文时它成为forwarding reference。这就涉及到两条原则。第一条原则是引用折叠原则A  折叠成 AA  折叠成 AA  折叠成 AA  折叠成 A第二条是特殊模板参数推导原则1.如果fwd传进的是个A类型的左值那么T被决议为A。2.如果fwd传进的是个A类型的右值那么T被决议为A。将两条原则结合起来就可以实现完美转发。A x; fwd(x); //推导出fwd(A ) 折叠后fwd(A) A foo();fwd(foo());//推导出fwd(A ) 折叠后 fwd(A)std::forward应用于forwarding reference代码看起来如下templatevoid fwd(T t){    foo(std::forward(t));}要想展开完美转发的过程我们必须写出forward的实现。接下来就尝试forward该如何实现分析一下std::forward是条件cast的T的推导类型取决于传参给t的是左值还是右值。因此forward需要做的事情就是当且仅当右值传给t时也就是当T推导为非引用类型时,forward需要将t左值转成右值。forward可以如下实现:templateT forward(typename remove_reference::type t){    return static_cast(t);}现在来看看完美转发是怎么工作的我们预期当传进fwd的参数是左值从forward返回的是左值引用传进的是右值forward返回的是右值引用。假设传给fwd是A类型的左值那么T被推导为A:void fwd(A  t){    foo(std::forward(t));}forward实例化A  forward(typename remove_reference::type t){    return static_cast(t);}引用折叠后A forward(A t){    return static_cast(t);}可见符合预期。再看看传入fwd是右值时那么T被推导为A:void fwd(A  t){    foo(std::forward(t));}forward实例化如下A forward(typename remove_reference::type t){    return static_cast(t);}也就是A forward(A t){    return static_cast(t);}forward返回右值引用很好完全符合预期。
http://www.zqtcl.cn/news/621244/

相关文章:

  • 标准网站建设推荐帮别人做网站开票开什么税目
  • 温州网站优化衡阳县专业做淘宝网站
  • 门户网站建设存在的问题和差距无锡做智能网站
  • 受欢迎的常州做网站网站制作ppt
  • 物流网站建设实例 天堂资源帝
  • 太原建设厅官方网站wordpress 导入工具
  • 做网站树立品牌形象建设了网站后怎么用谷歌引流
  • 专业公司网站建设建设人才库网站
  • 怎么自己做直播网站吗手机免费建站app
  • 惠州规划建设局网站seo网站关键词排名优化公司
  • 关键词检测百度seo一本通
  • 做效果图的外包网站徐州低价seo
  • xp系统中做网站服务器吗网站设计版权
  • 化妆品网站建设经济可行性分析怎么做好网站
  • 软件企业网站建设栏目结构图服务公司有哪些
  • 郑州专业做淘宝网站推广哪些公司需要网站开发工程师
  • 如何为企业做网站单页网站推广
  • 做公众号封面图的网站凡客精选app
  • 张家界做旅游网站网业小说畅读服务
  • 短租网站那家做的好网络设计工作好找吗
  • 企业建网站哪家好网络书签 wordpress
  • 网站策划的工作职责有关网站开发的创意
  • 上国外网站dns如何免费做网站推广
  • wordpress导航站的源码网页设计与制作微课教程第4版李敏
  • 建站的好公司wordpress 小工具 调用
  • 郑州高考网站建设wordpress调用多个底部
  • 在线做爰直播网站dw制作网页步骤
  • 视频网站 php源码深圳高端网站建设招聘
  • 企业网站服务费怎么做记账凭证那个网站上有打码的任务做
  • 沈阳做网站优化的公司长春网络建站模板