首页 > 编程语言 >C++ | 4-易用性改进

C++ | 4-易用性改进

时间:2023-01-04 10:11:17浏览次数:44  
标签:decltype auto 易用性 C++ 改进 引用 expr 类型 表达式

使用auto

自动类型推断,顾名思义,就是编译器能够根据表达式的类型,自动决定变量的类型(从 C++14 开始,还有函数的返回类型),不再需要程序员手工声明。

但需要说明的是,auto 并没有改变 C++ 是静态类型语言这一事实——使用 auto 的变量(或函数返回 值)的类型仍然是编译时就确定了,只不过编译器能自动帮你填充而已。

自动类型推断不仅降低了代码的啰嗦程度,也提高了代码的抽象性,使我 们可以用更少的代码写出通用的功能。

auto 实际使用的规则类似于函数模板参数的推导规则。

     当写了一个含 auto 的表 达式时,相当于把 auto 替换为模板参数的结果。举具体的例子:

        auto a = expr; 意味着用 expr 去匹配一个假想的 template f(T) 函数模板,结果为值类型。

        const auto& a = expr; 意味着用 expr 去匹配一个假想的 template f(const T&) 函数模板,结果为常左值引用类型。

        auto&& a = expr; 意味着用 expr 去匹配一个假想的 template f(T&&) 函数模板,根据 [第 3 讲] 中我们讨论过的转发引用和引用坍缩规则,结果是 一个跟 expr 值类别相同的引用类型。 

 

decltype

decltype 的用途是获得一个表达式的类型,结果可以跟类型一样使用。它有两基本用 法:

  1. decltype(变量名) 可以获得变量的精确类型。

  2. decltype(表达式) (表达式不是变量名,但包括 decltype((变量名)) 的情况)可以获得表达式的引用类型;

      除非表达式的结果是个纯右值(prvalue),此时结果仍然是值类型。

例子:

    如果我们有 int a;,那么:

     decltype(a) 会获得 int(因为 a 是 int)。

     decltype((a)) 会获得 int&(因为 a 是 lvalue,情况二表达式情况)。

     decltype(a + a) 会获得 int(因为 a + a 是 prvalue)。

 decltype(auto)

通常情况下,能写 auto 来声明变量肯定是件比较轻松的事。但这儿有个限制,需要在写 下 auto 时就决定你写下的是个引用类型还是值类型

根据类型推导规则,auto 是值类 型,auto& 是左值引用类型,auto&& 是转发引用(可以是左值引用,也可以是右值引 用)。

       使用 auto 不能通用地根据表达式类型来决定返回值的类型。

不过, decltype(expr) 既可以是值类型,也可以是引用类型。因此,我们可以这么写:

decltype(expr) a = expr;

这种写法明显不能让人满意,特别是表达式很长的情况(而且,任何代码重复都是潜在的问 题)。为此,C++14 引入了 decltype(auto) 语法。对于上面的情况,我们只需要像下 面这样写就行了。

decltype(auto) a = expr;

这种代码主要用在通用的转发函数模板中:可能根本不知道你调用的函数是不是会返回一 个引用。这时使用这种语法就会方便很多。

 

标签:decltype,auto,易用性,C++,改进,引用,expr,类型,表达式
From: https://www.cnblogs.com/JohnsonQ/p/17022648.html

相关文章

  • C++ 数学与算法系列之牛顿、二分迭代法求解非线性方程
    1.前言前文介绍了如何使用“高斯消元法”求解线性方程组。本文秉承有始有终的态度,继续介绍“非线性方程”的求解算法。本文将介绍2个非线性方程算法:牛顿迭代法。二......
  • C++11:移动构造函数
    1.拷贝构造函数中的深拷贝问题在C++98/03标准中,如果想用其它对象初始化一个同类的新对象,只能借助类中的拷贝构造函数。拷贝构造函数的实现原理很简单,就是为新对象复制......
  • C++中的模板
    如果函数的参数类型不确定,可以使用函数模板template<classT>Tmax(Ta,Tb){ returna>b?a:b;}如果类的成员类型不确定,可以使用类模板。这样定义类:template......
  • 【C++】万能头文件 bits/stdc++.h 的用法和优缺点
    一.使用方法1#include<bits/stdc++.h>23intmain()4{5//writecodehere67return08}二、头文件内容1//C++includesusedforpr......
  • C++实现线性表-顺序表的合并操作代码
    #include<iostream>#include<cstdlib>//C++动态分配存储空间usingnamespacestd;#defineOK1#defineERROR0#defineMAXSIZE100typedefintElemtype;typedefintStat......
  • C++:拷贝构造函数
    1.拷贝和拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是copy。对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同......
  • C++继承
    一、继承的写法子类:继承父类 例:classA   ------>父类{public:A(stringname,intage):name(name),age(age){}   -->初始化参数列表protected: string......
  • 如何在C++/C#中进行Halcon对象的垃圾回收?
    由于.NET中是让垃圾收集器GarbageCollector(简称GC)删除未使用的对象。但是,由于GC只是不时地删除未使用的对象,因此同时使用的内存会增加。更重要的是,对于GC来说,HALCON的......
  • 软件开发入门教程网 Search之C++ 类 & 对象
       ......
  • C++ 注释
       ......