C++11新增语法特性及标准库简介

2023-10-31

1. core language features

1.1. C99 preprocessor

C99的预处理器宏可以支持一些复杂的操作,VS2015支持部分特性,VS2019支持更多。很多大型C项目,像CPython、ffmpeg等,需要支持C99,所以需要使用VS2019编译。C++程序员,一般少用宏,尤其是复杂的宏。

1.2. static_assert

执行编译时的断言检测,提前发现问题,降低Bug修复成本。VS2010及之后的版本支持此特性。
C++11中的static_assert是一种编译时断言,它允许程序员检查模板参数或其他编译时常量的属性。如果条件失败,它会停止编译并生成一个编译器错误信息。它的语法是 static_assert(condition, message)

static_assert((sizeof(var) >= 4), "Error");

1.3. Right angle brackets

typedef std::vectorstd::vector Flags;C++11之前,右边的>>需要空格才可以。
在C++11中,右尖括号(>)可以用于表示模板参数,而无需在它们之间添加空格。这被称为“右边角括号”问题,其中编译器会将两个连续的尖括号(>>)解释为右移运算符,而不是模板参数的关闭尖括号对。

例如,您可以使用以下语法:

std::vector<std::vector<int>>

而不是以下语法:

std::vector<std::vector<int> >

这使代码更易于阅读,并避免了由双尖括号的歧义可能引起的错误。
VS2005及之后的版本支持此特性。

1.4. Extended friend declarations

C++11引入了扩展友元声明(Extended friend declarations)的新特性,可以更加灵活地定义友元。VS2013及之后的版本支持此特性。示例如下:

class C;
typedef C Ct;
class X1 {
friend C; // OK: class C is a friend
};
class X2 {
friend Ct; // OK: class C is a friend
friend D; // error: no type-name D in scope
friend class D; // OK: elaborated-type-specifier declares new class
};

1.5. long long

long long占用8个字节(64位),可以表示的整数范围是从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。VS2005及之后的版本支持此特性。

1.6. Compiler support for type traits

可以用来判断类型状态,有**has_virtual_destructor、**is_base_of等函数。VS2015及之后的版本支持此特性。

// has_virtual_destructor.cpp
#include <stdio.h>
struct S {
   virtual ~S() {}
};
int main() {
   __has_virtual_destructor(S) == true ? 
      printf("true\n") : printf("false\n");
}

// is_base_of.cpp
#include <stdio.h>
struct S {};
struct T : public S {};
int main() {
   __is_base_of(S, T) == true ? 
      printf("true\n") : printf("false\n");
   __is_base_of(S, S) == true ? 
      printf("true\n") : printf("false\n");
}

1.7. auto

原先用于声明自动变量的功能被废除,新功能为修改变为通过变量的初始化值来推导出变量的类型。
VS2010及之后的版本支持此特性。新功能简单示例:

auto x = 5; // ok, x has type int
const auto *v = &x, u = 6; // ok, v has type const int*, u has type const int
static auto y = 0.0; // ok, y has type double
static auto int z; // ill−formed, auto and static conflict
auto int r; // ok, r has type int

1.8. Delegating constructors

类可能有很多构造函数,有时一个构造函数的功能其实是在另一个构造函数的功能之上再添加一点新的功能。
传统的方法下,如果想共用相同的代码,必须将相同代码抽象为一个函数,然后再共用。VS2013及之后的版本支持此特性。
有没有更方便的方法呢?C++11中提出的委托构造函数,可以实现相关功能。

class Foo
{
public: 
    Foo(char x, int y) {}
    Foo(int y) : Foo('a', y) {} // Foo(int) delegates to Foo(char, int)
};

1.9. extern template

extern template 是 C11 中的一个特性,用于显式实例化模板。在 C 中,模板可以提供泛型编程支持,但在不同的编译单元中,对同一个模板进行实例化会带来一些问题,例如代码膨胀和编译时间增加等。VS2010及之后的版本支持此特性。
为了解决这个问题,C++11 引入了 extern template 关键字,它允许将模板的实例化推迟到其他编译单元中。具体来说,使用 extern template 可以将模板实例化放在一个编译单元中,并在其他编译单元中使用 extern template 声明来避免重复实例化。
以下是一个示例代码:

// test.h
template <typename T>
class Test {
public:
    void func();
};

// test.cpp
#include "test.h"
template <typename T>
void Test<T>::func() {
    // Implementation here...
}
template class Test<int>;
template class Test<double>;

// main.cpp
#include "test.h"
extern template class Test<int>;
int main() {
    Test<int> t;
    t.func();
    return 0;
}

在上述示例代码中,我们首先定义了一个名为 Test 的类模板,在 test.cpp 文件中实例化了该模板,并在 main.cpp 文件中使用 extern template 关键字声明了 Test 的实例化。这样做可以避免在 main.cpp 编译时再次实例化 Test,从而加速编译过程并减少代码膨胀。

1.10. constexpr

constexpr是C++11中新引入的指示符,允许函数和变量在编译时计算出值,可以大幅提升代码性能。例如,斐波那契数列的计算,可以直接在编译时计算出来。如下图,factorial函数直接被编译为表格,直接查表获取。VS2015及之后的版本支持此特性。
image.png

1.11. Template aliases

C++11引入了模板别名(Template aliases)功能,可以使用using关键字来定义一个模板别名。它允许程序员为现有的类型或模板起一个新的名称,以方便使用和提高代码的可读性。VS2013及之后的版本支持此特性。
以下是一个示例代码:

template<typename T>
using Vec = std::vector<T>; // 定义一个模板别名Vec,表示std::vector<T>

int main()
{
    Vec<int> v{1, 2, 3}; // 使用Vec作为std::vector<int>的别名
    for (auto i : v)
        std::cout << i << ' ';
}

1.12. char16_t and char32_t

C++11引入了两个新的字符类型:char16_t和char32_t。它们分别用于表示16位和32位的Unicode字符,以支持国际化和本地化应用程序开发。VS2015及之后的版本支持此特性。
char16_t表示一个16位的Unicode字符,类似于wchar_t,但是其大小是固定的。可以使用u前缀来表示一个char16_t字符常量,例如:

char16_t c = u'中';

char32_t表示一个32位的Unicode字符,也可以使用U前缀来表示一个char32_t字符常量,例如:

char32_t c = U'									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11新增语法特性及标准库简介 的相关文章

随机推荐

  • 学习笔记 01 Java语法

    JAVA基础语法01 笔记 标识符 标识符可以由字母 下划线 和美元符 组成 不能以数字开头 标识符不能是Java关键字和保留字 变量 数值型 整数类型 byte 1 27 27 1 short 2 32768 32717 2 15 int
  • please configure the postgressql binary path_postgres数据库备份错误

    please configure the postgressql binary path postgres数据库备份错误 备份错误 please configure the postgressql binary path 解决方法 file
  • 【C++】基类和派生类构造函数的调用顺序

    首先说说构造函数 大家都知道构造函数里就可以调用成员变量 而继承中子类是把基类的成员变成自己的成员 那么也就是说子类在构造函数里就可以调用基类的成员了 这就说明创建子类的时候必须先调用基类的构造函数 只有这样子类才能在构造函数里使用基类的成
  • 上传了ipa但在苹果App Store中没有看到构建版本的问题

    AU上传ipa出现下图红框提示说明成功上传 但有时App Store后台没有出现构建版本 请查看下面详细说明 一 首先登录iTunes Connect 后台 查看ipa构建情况 https appstoreconnect apple com
  • 点击.txt文件显示"不是有效的Win32应用程序"处理方法

    方法是 我的电脑 工具 文件夹选项 文件类型 找到txt文件 新建 操作为open 命令行为 C WINDOWS system32 NOTEPAD EXE 1 然后检查 windows system32文件夹下有没有NOTEPAD EXE
  • VMware Fusion Pro v10.1.6 苹果虚拟机免费版及解锁许可证

    说到虚拟机可以说现在市场上VM牌子的虚拟机是最为强大的一款没有之一 虽然还有一款德国软件公司InnoTek所开发的 VirtualBox 免费开源轻量级虚拟机软件 但是VMware 是这些虚拟机无法比拟的 Windows 平台 VMware
  • k8s 二进制安装多master节点高可用集群

    k8s 集群环境规划 系统统一使用 CentOS 7 9 192 168 1 10 k8s m1 控制节点1 192 168 1 11 k8s m2 控制节点2 192 168 1 20 k8s w1 node节点1 192 168 1 2
  • gtest测试用例

    google tf测试框架代码 https github com google googletest tree 2fe3bd994b3189899d93f1d5a881e725e046fdc2 跑单个测试例 test gtest filte
  • shell中if语句特殊参数

    shell中if语句特殊参数 d 判断制定的是否为目录 z 判断制定的变量是否存在值 n 判断指定的变量是否为null f 判断制定的是否为文件 L 判断制定的是否为符号链接 r 判断制定的是否可读 s 判断存在的对象长度是否为0 w 判断
  • 2023_Spark_实验九:Scala函数式编程部分演示

    需求 1 做某个文件的词频统计 某个单词在这个文件出现次数 步骤 1 文件单词规律 空格分开 2 单词切分 3 单词的统计 k v gt k 单词 V 数量 4 打印 框架 1 单例对象 main 2 创建CONF 3 创建SC gt 读取
  • Python--matplotlib绘图可视化知识点整理

    本文作为学习过程中对matplotlib一些常用知识点的整理 方便查找 强烈推荐ipython无论你工作在什么项目上 IPython都是值得推荐的 利用ipython pylab 可以进入PyLab模式 已经导入了matplotlib库与相
  • 在nginx的配置文件中,设置故障转移的策略、、配置健康检查

    要保证客户端在访问时不出错 可以采取以下几种方法 1 使用负载均衡器 在nginx服务器的前面添加一个负载均衡器 负载均衡器可以将客户端的请求分发到多个后端服务器上 当其中一个服务器宕机时 负载均衡器会自动将请求转发到其他正常运行的服务器上
  • thinkPHP 文件上传(文件太大不成功)

    thinkPHP 文件上传 文件太大不成功 补充一下上次说的文件上传 如果我们上传的文件太大而导致失败 我们可以在 php ini 这个配置文件修改两个字段 upload max filesize 50m post max size 50m
  • centos对已存在的文件夹创建软连接

    描述 由于 目录可用空间 即将存在不够用的情况 需要将 opt data 文件夹 应用中的一些 数据会不断的在此文件夹中累加 中创建软连接 将其直到 data opt data 进而 保证 目录不用爆满 文件系统 容量 已用 可用 已用 挂
  • 【云原生进阶之PaaS中间件】第二章Zookeeper-2-安装部署

    1 Zookeeper安装配置 环境准备 一台安装有jdk的虚拟机 192 168 152 130 1 1 安装 1 1 1 下载 cd software wget http mirror bit edu cn apache zookeep
  • Android logcat 命令小结

    logcat 是 Android 开发最常用的 debug 方式 记录下常用的命令 1 清除缓冲区 logcat c 2 查看缓冲区大小 logcat g 3 修改缓冲区大小 logcat G 10m 有些机器的缓冲区很小 不修改的话 有可
  • Go+Together——Go+1.0发布会暨Go+开发者基金会启动仪式重磅来袭!

    你想参与iPhone13抽奖吗 你想和大咖面对面交流吗 你想收获最前沿的行业动态吗 10 月15 日 Go Together Go 1 0发布会暨Go 开发者基金会启动仪式重磅来袭 活动中除七牛云 CEO Go 语言发明人许式伟以及Go 开
  • 感知机(Perceptron)-----最详细记录感知机

    1 前言 感知机是1957年 由Rosenblatt提出会 是神经网络和支持向量机的基础 感知机是有生物学上的一个启发 他的参照对象和理论依据可以参照下图 我们的大脑可以认为是一个神经网络 是一个生物的神经网络 在这个生物的神经网络里边呢
  • uniapp nvue页面 map地图全屏设置

    nvue页面 100vh 以及百分比不可用 1 可以获取当前屏幕高度 然后赋值
  • C++11新增语法特性及标准库简介

    1 core language features 1 1 C99 preprocessor C99的预处理器宏可以支持一些复杂的操作 VS2015支持部分特性 VS2019支持更多 很多大型C项目 像CPython ffmpeg等 需要支持
Powered by Hwhale