C++ 17现在功能齐全,因此不太可能经历大的变化.为C++ 17提出了数百个提案.
在C++ 17中,哪些特性被添加到C++中?
当使用支持"C++ 1z"的C++编译器时,当编译器更新到C++ 17时,哪些功能可用?
此常见问题解答涉及聚合和POD,并涵盖以下材料:
C++容器的迭代器失效规则是什么?
优选地以摘要列表格式.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
一个例子通常比长期解释更好.
您可以在Coliru上编译并运行此代码段.
(另一个前例子也可用)
#include <map>
#include <iostream>
struct MyClass
{
enum class …Run Code Online (Sandbox Code Playgroud) P0137引入了函数模板, std::launder并在有关联合,生命周期和指针的部分中对标准进行了许多更改.
这篇论文解决了什么问题?我必须注意哪些语言的变化?我们在做什么launder?
std::string_view已经使它成为C++ 17,并且它被广泛推荐使用它代替const std::string&.
其中一个原因是表现.
有人可以解释与用作参数类型相比,究竟 std::string_view是什么/将会更快const std::string&?(假设在被叫方中没有副本)
在开始大喊未定义的行为之前,这在N4659(C++ 17)中明确列出
i = i++ + 1; // the value of i is incremented
Run Code Online (Sandbox Code Playgroud)
i = i++ + 1; // the behavior is undefined
Run Code Online (Sandbox Code Playgroud)
改变了什么?
从我可以收集,从[N4659 basic.exec]
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的.[...]在运算符结果的值计算之前,对运算符的操作数的值计算进行排序.如果相对于同一存储器位置上的另一个副作用或者使用同一存储器位置中的任何对象的值进行的值计算,对存储器位置的副作用未被排序,并且它们不可能是并发的,则行为是未定义的.
其中值定义为[N4659 basic.type]
对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,该值是实现定义的值集的一个离散元素
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的.[...]在运算符结果的值计算之前,对运算符的操作数的值计算进行排序.如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.
同样,值定义在[N3337 basic.type]
对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,该值是实现定义的值集的一个离散元素.
它们是相同的,除了提及无关紧要的并发性,并且使用内存位置而不是标量对象,其中
算术类型,枚举类型,指针类型,指向成员类型的指针
std::nullptr_t以及这些类型的cv限定版本统称为标量类型.
这不会影响示例.
赋值运算符(=)和复合赋值运算符都是从右到左分组.所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值.如果左操作数是位字段,则所有情况下的结果都是位字段.在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.右操作数在左操作数之前排序.
赋值运算符(=)和复合赋值运算符都是从右到左分组.所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值.如果左操作数是位字段,则所有情况下的结果都是位字段.在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.
唯一的区别是N3337中没有最后一句话.
然而,最后一句话不应该具有任何重要性,因为左操作数i既不是"另一个副作用"也不是 …
C和C++中的数字pi存在一个相当愚蠢的问题.据我知道M_PI的定义math.h是没有任何标准要求.
新的C++标准在标准库中引入了许多复杂的数学 - 双曲函数,std::hermite以及std::cyl_bessel_i不同的随机数生成器等等.
是否有任何"新"标准为pi带来了一个常数?如果没有 - 为什么?没有它,所有这些复杂的数学如何运作?
我知道关于C++中pi的类似问题(它们已经有几年了,而且标准已经很久了); 我想知道问题的当前状态.
我也非常感兴趣为什么 C++仍然没有pi常量,但有很多更复杂的数学.
UPD:我知道我可以将自己定义为4*atan(1)或acos(1)或double pi = 3.14.当然.但为什么在2018年我仍然必须这样做?没有pi,标准数学函数如何工作?
string_view是C++ Library Fundamentals TS(N3921)中添加到C++ 17中的一个提议特性
据我所知,它是一种代表某种字符串"概念"的类型,它是任何类型的容器的视图,可以存储可视为字符串的东西.
const std::string&参数类型应该
变成string_view吗?string_view需要考虑吗?由于C ++ 17可以编写一个if块,因此将完全执行一次,如下所示:
#include <iostream>
int main() {
for (unsigned i = 0; i < 10; ++i) {
if (static bool do_once = true; do_once) { // Enter only once
std::cout << "hello one-shot" << std::endl;
// Possibly much more code
do_once = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可能对此有过多的思考,还有其他方法可以解决此问题,但是仍然-是否可以以这种方式编写此文本,因此do_once = false最后不需要?
if (DO_ONCE) {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
我在考虑一个辅助函数,do_once()其中包含static bool do_once,但是如果我想在不同的地方使用相同的函数呢?可能这是时间和地点#define吗?我希望不是。
c++ ×10
c++17 ×10
c++-faq ×3
c++11 ×3
string ×2
string-view ×2
aggregate ×1
c++14 ×1
c++20 ×1
enums ×1
if-statement ×1
iterator ×1
memory ×1
standards ×1
stdlaunder ×1