转眼间,C++20的标准已经发布快两年了。不少C++的开源项目也已经将标准升级到最新的C++20了,笔者也开启了新标准的学习历程了。...std::is_same_v); static_assert(!...std::is_same_v); static_assert(!...1). a + a这个是最简单的,该表达式能通过编译则代表符合要求,这里不会进行实际的计算。 2). typename T::type代表需要,T类型定义了type类型,才符合要求 3)....(真搞不懂搞这么多写法干什么,不能统一一下吗?
你只需要用 default 礼貌地要求它即可。在这种情况下,你会得到所有六种比较运算符:==、!=、、>=。...(a == b); static_assert(!...= b)); static_assert(!(a < b)); static_assert(a <= b); static_assert(!...20 之前,你不能将字符串用作非类型的模板参数。...对于一个即时函数,每一次函数调用都必然产生一个编译时常量表达式。即时函数是隐式的 constexpr 函数。
文章 Stack overflow in ping(8) 离谱,freebsd的ping 有溢出漏洞 const vs constexpr vs consteval vs constinit in C+...+20 来个 表格 关键字 放在变量前 放在static/thread_local前 放在函数前 常量表达式前 const 可以 可以 成员函数 有时可以 constexpr 可以 (初始化得是constexpr...return false; } static_assert(not if_hell(false, false)); static_assert(not if_hell(false, true)); assert...return true; } static_assert(not if_heaven(false, false)); static_assert(not if_heaven(false, true))..., C++20 edition On Windows Runtime asynchronous operations with critical progress reports The case of
相比之下C++17的新内容要多很多,是完善的再完善 C++20由于好多特性都没被支持好,本身又属于非常大的一次变革,所以那部分就暂不翻译了 ?...新特性一览 语言新特性 类模板的模板参数推断 用auto来声明非类型的模板参数 折叠表达式 auto对花括号初始化的新推断规则 Lambda的常量表达式形式 Lambda可以值捕获this了 内联变量...double类型作为模板参数的类型,因而也不能对其进行auto推断 折叠表达式(Folding expressions) 折叠表达式是为了优化C++11引入的参数包而生的。...addOne(1) == 2); Lambda可以值捕获this了(Lambda capture this by value) 之前的时候在Lambda中捕获的this只能是引用形式的。...一个有问题的例子是对于引用捕获,Lambda要求其对象必须确实存在,但有可能到了调用的时候已经超过了目标对象的生命周期。
关键字列表 关键字 解释 alignas 指定变量或类型的最小对齐要求(C++11) alignof 返回类型的对齐要求(C++11) and 逻辑与运算符的替代表示符 and_eq 位与赋值运算符的替代表示符...switch语句 case switch语句中的一个案例分支 catch 捕获异常块 char 字符类型 char16_t 16位Unicode字符(C++11) char32_t 32位Unicode...字符(C++11) class 定义一个类 compl 位非运算符的替代表示符 const 定义常量或常量表达式 constexpr 定义编译时计算的常量表达式(C++11) const_cast 移除对象的常量性...双精度浮点数类型 dynamic_cast 安全地转换指针或引用的类型 else if语句的替代条件分支 enum 定义枚举类型 explicit 阻止构造函数的隐式自动类型转换 export 模板定义的导出(C+...重新解释类型的强制类型转换 return 从函数返回值 short 短整型数据类型 signed 有符号类型修饰符 sizeof 计算类型或变量的大小 static 声明静态存储期的变量或类的静态成员 static_assert
#include #include static_assert(std::is_same_v); static_assert(typeid...); static_assert(typeid(int) == typeid(const int&)); static_assert(not std::is_same_v...12345"}; Employee e2 = {"Bob", "24601"}; e1 = e2; // oops std::swap(e1, e2); // oops 返回值也不建议const, 拿了不能改...Programming in C++ - Fedor Pikus - CppCon 2021 讨论省分支的技巧,其实主要是省cpu,利用cpu的pipeline,所以循环可以展开,分支可以尽量省掉 用冒号表达式...要写就写最难的 Just Enough Assembly for Compiler Explorer - Anders Schau Knatten - CppCon 2021 手把手教你学汇编,值得一看 C+
C++11中引入了静态断言关键字,定义格式为static_assert(表达式,"提示字符串"),主要是当表达式不成立时产生一条编译错误。...如下面的代码所示: int main() { static_assert(1!...) #define NUMBER "ONE" #elif __has_include() #define NUMBER "TWO" #endif 需要关注的是,由于它是预处理指令是不能放在源代码中的...表示初始化整型变量 auto i{42,34};//表示整形列表 auto i={42};//表示整形列表 auto i={42,34};//表示整形列表 5 十六进制浮点数字面量 使用10进制数表示浮点数时并不能准确的知道数据的保存精度...auto c = u8'v'; char b = u8'm'; 在这里需要说明的是C++不同的版本对使用u8后转换的字符类型定义是不一样的,如:在 C++17 中, u8'6' 的类型是 char,在 C+
return {}; } private: }; int main() { MyClass mc; auto r = mc.getCostly(); } 这样调用会报错,因为你不是move的不能调用...Build(); DoSomething(conf); 这段代码的问题在于,不能保证别人执行了Build这行代码,也不能保证所有代码都只执行一次,怎么做?...(std::totally_ordered); static_assert(std::totally_ordered); static_assert(std::totally_ordered...double std::cout << typeid(sum(true, false)).name() << '\n'; // int std::cout << '\n'; } c+...Design: Principle of Least Surprise 在线评价别人的代码中的API设计是不是合理 Meeting C++ online - Andreas Reischuck - Using C+
constructor auto value = f(); // undefined behaviour, dandling reference } } 终于进c++了,叫move_only_function c+...return tmp; } constexpr int smartSum(unsigned int n) { return (1+n)*(n/2); } int main() { static_assert...long_enum_name { hello, world, coding }; void func(long_enum_name len) { #if defined(__cpp_using_enum) // c+...range-for的缺陷问题,有了新的解决方案 //for (init; decl : expr) for (auto& x : foo().items()) { /* .. */ } // 生命周期问题,不能这么搞...(c == 200); constexpr auto val = 10; static_assert(sum(val, val) == 2*val); int a = 10;
static_assert(-42 == -42z); static_assert(-42 == -42Z); static_assert(42 == 42uz); static_assert(42 =...= 42uZ); static_assert(42 == 42Uz); static_assert(42 == 42ZU); static_assert(42 == 42Zu); static_assert...++ Weekly - Ep 324 - C++20’s Feature Test Macros 介绍测试宏的。...就给了个图,实现细节啥也没说 Cute C++ Tricks, Part 2 of N: More code you should learn from and never write constexpr里不能用...static_assert但能用assert,为啥?
--- 资讯 编译器信息最新动态推荐关注hellogcc公众号 本周周报github直达 文章 Non-Terminal Variadic Parameters and Default Values c+...>(1); throw v; // OK: implicit move (since C++14ish) throw p; // OK: implicit move (since C+...std::make_unique(42), 42); } 可以Godbolt自己调一下看看 Counting the number of fields in an aggregate in C+...20 读着读着发现就是magic_get/boost.pfr的方法,利用结构化绑定探测字段 What C++ Fold Expressions Can Bring to Your Code 还是讲折叠表达式...(values)}; static_assert(numberOfValues > 0); return (... + (values / numberOfValues)); } //
今天推荐一个新书,C++20的一些特性: 通过Modules淘汰了C++之前编写大程序的陈旧方式; 使用Concepts帮助创建类型安全的模板和实现灵活的模板特化; 使用Ranges彻底改变了处理数据的方式...C++20中,可使用lambda表达式捕获this方式,lambda表达式可以使用模板,某些时候不需要使用typename,结构体可以直接初始化。...概念将改变这个问题,让编程者为模板编写要求,而编译器则可以检查这个要求。...概念革新了思考和编写通用代码的方式,因为模板的要求是接口的一部分,类模板中的函数重载和特殊化可以基于概念进行,且编译器能够比较模板参数的要求与实际的模板参数,所以能得到更好的报错信息。...总之,C++20作为一个重大版本发布,又给C++带来了更多新的可能。
Practices jetbrains出的报告,关于c++20使用,编译工具cmake使用率,代码分析使用率做了个列举,这里直接贴一下 构建工具,cmake越来越普及,虽然难用 什么?...:operator<<(std::operator<<(std::cout, x), ", "); } } return 0; } std::initializer_list不能细想...,越想越复杂 Simple C++20 input and output iterators 演示代码。...*, const int&>); static_assert(std::is_layout_compatible_v); static_assert...(std::is_layout_compatible_v); static_assert(std::is_layout_compatible_v); static_assert
新特性一览 语言新特性 二进制字面值 泛型的Lambda表达式 初始化Lambda的捕获列表 推断返回类型 decltype(auto) 放宽对常量表达式函数的约束 变量模板 [[deprecated...(Lambda capture initializers) C14允许我们用任意的表达式对Lambda的捕获列表内容进行初始化了。...如今提供给捕获列表的名称不再需要与任何所在的局部范围的变量相关联了,而且可以向Lambda表达式输入引入新的名称了。...)>::value == 1); static_assert(std::is_same::value == 1); 放宽对常量表达式函数的约束...make_shared,C14引入了std::make_unique.由于以下几点原因std::make_unique是创建std::unique_ptr实例的推荐方式: 能避免使用到new运算符 当要求指针保持基础类型时避免代码的重复
C++ 动态新闻推送 第64期 文章 Did you know that C++20 made std::string constexpr?...#include constexpr auto foo() { return std::string{"bar"}; } static_assert("bar" == foo(...表达式)哪个更好?很难说,不一定没有分支更好。但相对好一些 因为:?...表达式编译器可能给你加私货,插入if,甚至生成jump,感觉更复杂了 就算你是一行代码,编译器还是可能给你加东西的 unsigned r = ((a & 0xffff0000) !...有点意思 svector小对象优化的vector HPX 1.8.0 released c++20全实现 nod 一个信号槽实现 ReactivePlusPlus一个ReactiveX实现
Lambda表达式的基本语法形式如下: [capture list] (parameter list) -> return type { // 函数体 } 其中: capture list:捕获列表...可以按值捕获、按引用捕获,也可以使用&表示按引用捕获、=表示按值捕获。 parameter list:参数列表,与普通函数的参数列表类似。...以下是一些示例: Lambda表达式不捕获任何外部变量,且不带参数和返回类型: [] { std::cout << "Hello, Lambda!"...表达式捕获外部变量: int x = 10; int y = 20; auto result = [&x, y] { return x + y; }(); 使用标准库算法和Lambda表达式:...static_assert 可以用于模板编程、泛型编程中对类型或常量表达式进行静态检查,帮助程序员在编译时发现潜在的问题,提高代码的可靠性和稳定性。 2.
/ide/编译器信息放在这里 编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-07-06 第157期 文章 c++ tip of week Did you know about C+...auto foobar = "foo"sv; template constexpr auto foobar = "bar"sv; struct none {}; static_assert...("unknown"sv == foobar); struct f { int foo; }; static_assert("foo"sv == foobar); struct b {...int bar; }; static_assert("bar"sv == foobar) void versus noreturn int divide1(int a, int b) {...不能。这个问题在range for中也有 就是生命周期问题。右值的生命周期被意外的延长了,使用 clang的-Wdangling-gsl帮你查 视频 cppnow视频开始放流了。
const:表示常量,一旦给定值就不能改变。例如const int a = 10;,a的值就不能再改变。 volatile:表示易变的,即程序无法预知该变量的值会随时发生变化。...例如: cpp复制代码 int arr[] = {1, 2, 3, 4, 5}; 通用 Lambda 捕获:C++14引入了通用 lambda 捕获,允许捕获变量,无论它们是否在作用域中。...可以使用概念来约束模板参数的类型,以便在模板实例化时确保类型符合特定的要求。这有助于提高代码的可读性和可维护性。...折叠表达式(Fold Expressions):C++20引入了折叠表达式,允许在展开二元或三元运算符时进行递归计算。这对于实现高阶函数和泛型算法非常有用。...例如,const int kConstantValue = 42; 常量表达式:使用const和字面值初始化器定义常量表达式。常量表达式必须是可以在编译时计算出结果的表达式,不能包含变量或函数调用。
同时函数中T 必须符合可相等比较 (EqualityComparable) 的要求 3-6中按照字典比较lhs和rhs的内容,其内部等价于调用std::lexicographical_compare函数进行比较...同时函数中T 必须符合[可小于比较 (LessThanComparable) 的要求。 7中也是按字典序比较lhs和rhs的内容。...include #include int main() { // 复制字符串字面量 auto a1 = std::to_array("foo"); static_assert...tuple_size > : std::integral_constant //C++11 起 { }; 其提供作为编译时常量表达式访问...在使用array容器的时候,其size必须是常量表达式(即编译时已知)。 不支持大小更改操作(调整大小、插入、擦除等)。
领取专属 10元无门槛券
手把手带您无忧上云