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

网站建设设计公司 知乎天津推广的平台

网站建设设计公司 知乎,天津推广的平台,地板网站模板,申请域名后怎样做网站文章目录autodecltypesauto 和 decltype 的配合—返回值类型后置关于 c11 新特性,最先提到的肯定是类型推导,c11 引入了 auto 和 decltype 关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。…

文章目录

      • auto
      • decltypes
      • auto 和 decltype 的配合—返回值类型后置

关于 c++11 新特性,最先提到的肯定是类型推导,c++11 引入了 auto 和 decltype 关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。

auto

auto:让编译器在编译期间就推导出变量的类型,可以通过 = 右边的类型推导出变量的类型
auto 关键字基本的使用语法如下:auto name = value;
示例:

auto a = 10;  // 10 是 int 型,可以自动推导出 a 是 intint i = 10;
auto b = i;  // b 是 int 型auto d = 2.0;  // d 是 double 型auto url = "http://c.biancheng.net/cplus/";  // 由双引号包围起来的字符串是 const char* 类型,所以推导出变量 url 的类型是 const char*,也即一个常量指针。

auto 的限制

  • auto 的使用必须马上初始化,否则无法推导出类型;
  • auto 在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败;
  • auto 不能用作函数参数;
  • 在类中 auto 不能用作非静态成员变量;
  • auto 不能定义数组,可以定义指针;
  • auto 无法推导出模板参数。
    示例:
int i = 10;
auto a = i, &b = i, *c = &i;  // a是int,b是i的引用,c是i的指针,auto就相当于intauto d = 0, f = 1.0;  // error,0和1.0类型不同,对于编译器有二义性,没法推导auto e;  // error,使用auto必须马上初始化,否则无法推导类型void func(auto value) {}  // error,auto不能用作函数参数class A {auto a = 1;         // error,在类中 auto 不能用作非静态成员变量static auto b = 1;  // error,这里与 auto 无关,正常 static int b = 1 也不可以,因为静态成员变量不能在类中初始化static const auto int c = 1;  // ok
};void func2() {int a[10] = {0};auto b = a;      // okauto c[10] = a;  // error,auto不能定义数组,可以定义指针vector<int> d;vector<auto> f = d;  // error,auto无法推导出模板参数
}

对引用的处理
当表达式的类型为引用时, auto 会抛弃引用类型,直接推导出它的原始类型。

int n = 10;
int& r1 = n;// auto推导
auto r2 = r1;
r2 = 20;
cout << n << ", " << r1 << ", " << r2 << endl;
// 打印结果:10, 10, 20

推导规则

首先,介绍下,这里的cv是指 cv 限定符,是 const 和 volatile 关键字的统称:

  • const 关键字用来表示数据是只读的,也就是不能被修改;
  • volatile 和 const 是相反的,它用来表示数据是可变的、易变的,目的是不让 CPU 将数据缓存到寄存器,而是从原始的内存中读取。

接着,看一下 auto 关键字对 cv 限定符的推导规则

  • 在不声明为引用或指针时,auto会忽略等号右边的引用类型和 cv 限定
  • 在声明为引用或者指针时,auto会保留等号右边的引用和 cv 属性
int i = 0;
auto* a = &i;  // a是int*
auto& b = i;   // b是int&
auto c = b;    // c是int,忽略了引用const auto d = i;  // d是const int
auto e = d;        // e是intconst auto& f = e;  // f是const int&
auto& g = f;        // g是const int&

什么时候使用 auto?
这里没有绝对答案,个人认为:在不影响代码可读性的前提下尽可能使用 auto 是合适的,复杂类型就使用 auto,但对于像 int、double 这种基础数据类型就没有必要使用 auto,看下面这段代码:

auto func = [&] {cout << "xxx";
};  // 对于 func 你难道不使用 auto 吗,反正我是不关心 lambda 表达式究竟是什么类型。auto asyncfunc = std::async(std::launch::async, func);
// 对于 asyncfunc 你难道不使用 auto 吗,我是懒得写 std::futurexxx 等代码,而且我也记不住它返回的究竟是什么...

decltypes

上面介绍 auto 用于推导变量类型,而 decltype 则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,decltype 也是编译时期进行自动类型推导。
decltype 关键字基本的使用语法如下:decltype(exp) varname = value;

  • exp 是表达式,decltype(exp) 和exp 类型相同
  • exp 是函数调用,decltype(exp) 和函数返回值类型相同
  • 其它情况,若 exp 是左值,decltype(exp) 是 exp 类型的左值引用

示例:

int func() { return 0; }
decltype(func()) i;  // i为int类型int x = 0;
decltype(x) y;      // y是int类型
decltype(x + y) z;  // z是int类型int a = 0, b = 0;
decltype(a + b) c = 0;   // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c;  // d是int&,因为(a+=b)返回一个左值

【注意1】decltype 不会像 auto 一样忽略引用和 cv 属性,decltype 会保留表达式的引用和 cv 属性:

cont int &i = 1;
decltype(i) b = 2; // b是const int&

【注意2】当表达式的类型为引用时,auto 和 decltype 的推导规则也不一样;decltype 会保留引用类型,而 auto 会抛弃引用类型,直接推导出它的原始类型。请看下面的例子:

int n = 10;
int& r1 = n;// auto推导
auto r2 = r1;
r2 = 20;
cout << n << ", " << r1 << ", " << r2 << endl;// decltype推导
decltype(r1) r3 = n;
r3 = 99;
cout << n << ", " << r1 << ", " << r3 << endl;
// 打印结果
// 10, 10, 20
// 99, 99, 99

【注意3】原则上讲,exp 就是一个普通的表达式,它可以是任意复杂的形式,但是我们必须要保证 exp 的结果是有类型的,不能是 void;例如,当 exp 调用一个返回值类型为 void 的函数时,exp 的结果也是 void 类型,此时就会导致编译错误。

只能使用 decltype 场景
auto 只能用于类的静态成员,不能用于类的非静态成员(普通成员),如果我们想推导非静态成员的类型,这个时候就必须使用 decltype 了。

#include <vector>
using namespace std;template <typename T>
class Base {
public:void func(T& container) { m_it = container.begin(); }private:decltype(T().begin()) m_it;  //注意这里
};int main() {const vector<int> v;Base<const vector<int>> obj;obj.func(v);return 0;
}

auto 和 decltype 的配合—返回值类型后置

auto 和 decltype 一般配合使用在推导函数返回值的类型问题上。
下面这段代码:

template <typename T, typename U>
return_value add(T t, U u) {  // t和v类型不确定,无法推导出return_value类型return t + u;
}

上面代码由于 t 和 u 类型不确定,那如何推导出返回值类型呢,我们可能会想到这种

template <typename T, typename U>
decltype(t + u) add(T t, U u) {  // t和u尚未定义return t + u;
}

这段代码在 c++11 上是编译不过的,因为在 decltype(t +u) 推导时,t 和 u 尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:

template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {return t + u;
}

返回值后置类型语法通过 auto 和 decltype 结合起来使用,目的为了解决函数返回值类型依赖于参数但却难以确定返回值类型的问题。

http://www.hrbkazy.com/news/29134.html

相关文章:

  • seo优化的网站百度本地惠生活推广
  • wordpress邮件发送超时武汉seo排名优化公司
  • 政府 网站管理系统 网络 架构seo如何建立优化网站
  • 二级网站有什么好处网络营销工程师
  • 如何做网站授权他达拉非片的作用及功效副作用
  • 无锡个人网站建设建站abc官方网站
  • 贸易网站建站网络营销成功案例分析
  • 微软做网站青岛网络推广公司排名
  • 郑州400建站网站建设杭州seo公司服务
  • 温州建设诚信评价网站公示新闻类软文
  • 外贸怎么上国外的网站广告公司联系方式
  • 网站建设-纵横网络网络seo推广
  • 整站网站优化推荐网络推广方案
  • 自己做公司的网站优秀的网页设计案例
  • 企业vi系统设计公司在运营中seo是什么意思
  • 重庆公司网站百度应用下载安装
  • 网站推广的方法和途径广州最新疫情最新消息
  • macbook做网站绑定域名品牌推广网络公司
  • 专线网站建设网络营销推广方案模板
  • 高端网站建设jm3q淮北网站建设
  • 佛山市禅城网站建设公司襄阳seo
  • 基于html css的网站设计深圳网站建设开发公司
  • java电商网站开发视频教程昆明装饰企业网络推广
  • 网站建设包含哪些建设阶段北京seo网站开发
  • 大连做网站孙晓龙西安企业seo外包服务公司
  • 怎么做浏览器网站网络营销主要内容
  • 网站全屏弹出窗口开封网站快速排名优化
  • 网站开发 英文产品如何做市场推广
  • 金融企业网站建设网站提交收录入口
  • 做网站注册会员加入实名认证功能新浪微博指数查询