首页 > 编程语言 >C++20语言核心特性的变化

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

时间:2023-11-30 21:35:13浏览次数:36  
标签:std 20 cout int 特性 C++ struct

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

  更多的介绍将在下次带来,感谢支持

标签:std,20,cout,int,特性,C++,struct
From: https://www.cnblogs.com/ChebyshevTST/p/17868410.html

相关文章

  • java-2023-11-30
    1、java中char类型由于使用Unicode编码所以是占两个字节而并不像C中是占一个字节。2、java中不使用0或非0值来代表假或真而是直接使用false或true。3、java中float和double由于精度不同不能进行比较,否则存在两值明显不等但输出的比较结果却为true的风险。4、如果运算结果可能超......
  • RuCode 2020 Division A+B. I ✖ [PR #5] 和平共处
    前言认认真真学习了一下这道题相关的做法以及有关的二分图网络流理论,感觉自己又刷新了一些东西的理解。所以说我们就从普通的二分图匹配开始吧!二分图匹配众所周知,二分图最大匹配可以用网络流Dinic算法做到\(O(m\sqrtn)\)的复杂度。在某些特定的图下,我们有一种“贪心流”......
  • 【Vulnhub 靶场】【DriftingBlues: 9 (final)】【简单】【20210509】
    1、环境介绍靶场介绍:https://www.vulnhub.com/entry/driftingblues-9-final,695/靶场下载:https://download.vulnhub.com/driftingblues/driftingblues9.ova靶场难度:简单发布日期:2021年05月09日文件大小:738MB靶场作者:tasiyanci靶场描述:getflags打靶耗时:2+小时打靶关键:......
  • 2023.11.30 练习
    CF1887C首先容易想到区间加需转化为差分,字典序的比较呢就考虑二分哈希。二分第一个不一样的位置,这个位置也一定是差分数组第一个不一样的。把哈希如果放到线段树上,那么在线段树上二分即可。我们依次处理修改的时候,顺便处理当前的最小的字典序。我们这里如果采用主席树,那么会......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记12
    20211306密码系统设计与实现课程学习笔记12任务详情自学教材第14章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个......
  • 实验4 现代C++标准库与类模板
    实验任务5task5.cpp#include"Textcoder.hpp"#include<iostream>#include<string>voidtest(){ usingnamespacestd; stringtext,encoded_text,decoded_text; cout<<"输入英文文本:"; while(getline(cin,text)) { encoded_t......
  • NOIp 2023 游记
    咕了正好一周的NOIp游记,是我第一篇游记,也是一张寄往四年后不得不退役的、即将画上青春句号的自己的,包含了自己的青涩、期待与成长的信笺。Day\((-\infty,-7)\)CSP-S2023打炸,135,很清楚蓝勾是没了,所以每天都在想到底能不能去NOIp。问过并没有教过我什么的教练,回复到应该要......
  • 实验4 现代C++标准库与类模板
    四、实验内容1.实验任务1//在C++中定义和使用类模板task1_1.cpp#include<iostream>usingnamespacestd;//类A的定义classA{public:A(intx0,inty0):x{x0},y{y0}{}voidshow()const{cout<<x<<","<<y<<endl;}p......
  • 实验4 现代C++标准库与类模板
    实验任务1task1task1_1.cpp#include<iostream>usingstd::cout;usingstd::endl;classA{public:A(intx0,inty0):x{x0},y{y0}{}voidshow()const{cout<<x<<","<<y<<endl;}private:in......
  • 2023人工智能计算大会AICC在京召开 产业热论大模型与智算力
    11月29日,以“智算力就是创新力”为主题的2023人工智能计算大会(AICC)在北京召开。本届大会由北京市科委中关村管委会、北京市经济和信息化局、海淀区政府支持,浪潮信息主办。大会重点围绕智算基础设施、大模型创新、AIInfra 技术创新、自动驾驶创新与应用、AIforScience、智算开放......