C++20语言核心特性的变化

这篇具有很好参考价值的文章主要介绍了C++20语言核心特性的变化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

using for Enumeration Values

  对比一下C++20前后的区别:

enum class State {
    open,
    progress,
    done = 9
};
// Before C++20
void print(State s) {
    switch (s) {
        case State::open:
            std::cout << "open\n";
            break;
        case State::done:
            std::cout << "done\n";
            break;
        case State::progress:
            std::cout << "progress\n";
            break;
        default:
            assert(nullptr);
    }
}
// Since C++20
void print1(State s) {
    using enum State;
    switch (s) {
        case open:
            std::cout << "open\n";
            break;
        case done:
            std::cout << "done\n";
            break;
        case progress:
            std::cout << "progress\n";
            break;
        default:
            assert(nullptr);
    }
}

void print2(State s) {
    using State::open, State::done, State::progress;
    switch (s) {
        case open:
            std::cout << "open\n";
            break;
        case done:
            std::cout << "done\n";
            break;
        case progress:
            std::cout << "progress\n";
            break;
        default:
            assert(nullptr);
    }
}

 

Range-Based for Loop with Initialization

  基于范围的for循环是C++11引入的新特性,自C++20起,基于范围循环也可以进行初始化。

int main() {
    std::vector v{1, 2, 3};
    for (int i{1}; const auto& item : v)
        std::cout << std::format("{}: {}\n", i++, item);
}

 

Feature Test Macros

  特性测试宏,正如其名,是为了当前版本编译器是否支持某个语言特性。这个宏以__cpp为前缀。

#if __cpp_generic_lambdas >= 201707
    // generic lambdas with template parameters can be used
#endif

#ifndef __cpp_lib_as_const
template <typename T>
const T& as_const(T& t) {
    return t;
}
#endif

 

Attribute [[no_unique_address]]

#include <iostream>

struct Empty {};

struct I {
    int i;
};

struct S {
    Empty e;
    int i;
};

int main() {
    std::cout << "sizeof(Empty): " << sizeof(Empty) << '\n';
    std::cout << "sizeof(I): " << sizeof(I) << '\n';
    std::cout << "sizeof(S): " << sizeof(S) << '\n';
}

  空类为了区分不同对象的地址,字节大小是1;而结构体S由于内存对齐的原因,所以字节大小是8。输出结果毫无疑问是1,4,8。

#include <iostream>

struct Empty {};

// EBCO
struct S : Empty {
    int i;
};

// no_unique_address
struct S2 {
    [[no_unique_address]] Empty e;
    int i;
};

int main() {
    std::cout << "sizeof(Empty): " << sizeof(Empty) << '\n';
    std::cout << "sizeof(S): " << sizeof(S) << '\n';
    std::cout << "sizeof(S2): " << sizeof(S2) << '\n';
}

  注解标签no_unique_address能起到和空基类优化相同的效果。

 

Attributes [[likely]] and [[unlikely]]

  在if/else,switch分支当中都可以使用,帮助编译器作分支预测的优化。

int f(int n) {
    if (n <= 0) [[unlikely]] {
        return n;
    } else {
        return n * n;
    }
}

int g(int n) {
    if (n <= 0) {
        return n;
    } else [[likely]] {
        return n * n;
    }
}

int h(int n) {
    switch (n) {
        case 1:
            //
            break;
        [[likely]] case 2:
            // 
            break;
    }

    return 0;
}

 

Attribute [[nodiscard]] with Parameter

  nodiscard用于修饰函数,当被修饰的函数发生调用(仅仅调用而不作赋值或者强制转换操作),编译器会报警告信息。

[[nodiscard]]
int f(int n) {
    return n;
}

int main() {
    f(1); // Warning
    int n = f(1); // OK
    reinterpret_cast<int *>(f(1)); // OK
}

 

New Character Type char8_t

    using namespace std::literals;

    auto c = u8'c'; // char8_t
    auto s = u8"Hello World"; // const char8_t *
    auto str1 = u8"Hello World"s; // std::u8string
    auto str2 = u8"Hello World"sv; // std::u8string_view

    std::cout << u8'c' << '\n'; // OK in C++17, error in C++20
    std::cout << u8"Hello World\n"; // OK in C++17, error in C++20
    std::cout << u8"Hello World\n"s; // OK in C++17, error in C++20
    std::cout << u8"Hello World\n"sv; // OK in C++17, error in C++20

    std::cout << c << '\n'; // OK in C++17, error in C++20
    std::cout << s << '\n'; // OK in C++ 17, error in C++20
    std::cout << str1 << '\n'; // OK in C++17, error in C++20
    std::cout << str2 << '\n'; // OK in C++17, error in C++20

  更多的介绍将在下次带来,感谢支持😃文章来源地址https://www.toymoban.com/news/detail-747593.html

到了这里,关于C++20语言核心特性的变化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CLickhouse核心特性

    目录 CLickhouse核心特性 1 完备的DBMS功能 2 列式存储与数据压缩 3 向量化执行引擎 4 关系模型与SQL查询 5 多样化的表引擎 6 多线程与分布式 7 多主架构 8 在线查询 9 数据分片与分布式查询 Clickhouse适用场景 Clickhouse不适用场景 Clickhouse名称含义 1 完备的DBMS功能 具备dbms(数据库管理

    2024年02月13日
    浏览(28)
  • Spark新特性与核心概念

    一、Sparkshuffle         (1)Map和Reduce         在shuffle过程中,提供数据的称之为Map端(Shuffle Write),接受数据的称之为Redeuce端(Shuffle Read),在Spark的两个阶段中,总是前一个阶段产生一批Map提供数据,下一阶段产生一批Reduce接收数据。         (2)Shuffle管理器      

    2024年02月08日
    浏览(38)
  • 【flink番外篇】20、DataStream 和 Table集成-Changelog Streams变化流示例

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年01月25日
    浏览(55)
  • Java SE 20 新增特性

    作者:Grey 原文地址: 博客园:Java SE 20 新增特性 CSDN:Java SE 20 新增特性 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_features 在Java SE 17 新增特性中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switc

    2024年02月02日
    浏览(42)
  • 深入解析Zookeeper:核心特性与节点类型全景剖析

    Zookeeper,作为一个关键的分布式应用协调框架,在多节点协作和数据同步方面发挥着不可或缺的作用。本文深入剖析了Zookeeper的核心概念,包括其基于内存的文件系统数据结构和高效的监听通知机制。详细介绍了Zookeeper的五种节点类型,包括持久化节点、持久化顺序节点、临

    2024年02月02日
    浏览(43)
  • Node【Node.js 20】新特性

    哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战; Node.js v20.0

    2023年04月26日
    浏览(34)
  • C++20新版本特性—编译时多态

    本章介绍如何使用C++进行编译时多态机制,编译时多态相比于运行时多态,会节省运行时的开销。 2.1 函数重载机制 在C语言中除了static函数以外,不支持同名函数,再加上没有名称空间的概念,因此程序员将多个编译单元链接在一起的时候,若出现同名函数将导致链接重定义

    2024年01月23日
    浏览(41)
  • Vue面试指南:探索Vue的核心概念和高级特性1

    1. 什么是Vue.js?它的主要特性是什么? Vue.js 是一个流行的开源 JavaScript 框架,用于构建用户界面和单页应用程序(SPA)。由于其易用性、灵活性和轻量级,它在开发者中非常受欢迎。下面是 Vue.js 的一些主要特性: 响应式数据绑定 :Vue.js 使用数据绑定和视图层的自动更新机

    2024年02月04日
    浏览(42)
  • C++核心编程—类和对象,类的三大特性——封装、继承、多态

    纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 ①什么是对象? 生活中有各种各样的 事物 ,如人、动物、植物等在C++中将这些称为对象。 对象多种多样, 各种对象的属性也不相同 。 例如狗的品种,毛色,年龄等 各个对象都有自己的行为 ,例

    2024年02月07日
    浏览(64)
  • 掌握C++20的革命性特性:Concepts

    C++20 引入了 Concepts,这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词,用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编译器错误更易于人类阅读。 我们都遇到过这样的情况:当为类或函数模板提供错

    2024年01月20日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包