使static_assert的文本信息可选
static_assert(sizeof(void*)==4, “64 - bit not supported”);//C++11引入,无需被调用 编译器报错
assert(sizeof(b)==sizeof(a));//运行期间 必须被调用
删除trigraphs
#\^[]{}|~每个字符用其他三个字符代替 比如??=
嵌套命名空间的定义
namespace X::Y{ ... }代替namespace X{ namespace Y{ ... } };
支持UTF-8字符文字
if等语句中的初始化器
就是在if语句里能初始化变量
if (FILE* fp = fopen("C:\\1.txt", "r+b"); fp != nullptr)
{
}
constexpr 来实现编译期循环或递归
template<typename T, typename ...Rest>
void f(T&& t, Rest&&...r)//参数包
{
if constexpr (sizeof...(r)) {//实现编译期循环或递归
do_something(t);
f(r...);
}
else {//递归出口
g(r...);
}
}
结构化的绑定声明:
在一行中声明多个变量并进行初始化,使用auto来声明多个变量,所有变量必须用中括号括起来
auto [a, b] = pair<int, string>(2, "33");
int arr[] = { 1,2,3 };
const auto& [a1, a2, a3] = arr;
set<string>s;
if (auto [it, success] = s.insert("hello"); success);//insert返回 pair<iterator,bool>
__cplusplus的值改为201703L
C++98是 199711L
C++11是201103L
编译器:gcc or vs中加 /std:c++17
某些情况下,确保通过编译器来进行copy elision(拷贝消除)
std::variant(变体)
union类型的安全替代没保存模板参数列表中某一类型得值或空值,variant不能在动态内存分配方式中使用
variant不可存放引用,数组或是void值
std::variant<int, double>v; //类似以前的union
v = 123;
int va = std::get<0>(v); //通过序号来取
int vb = std::get<int>(v);//通过类型来取
try {
double d = std::get<double>(v);
}
catch (const std::bad_variant_access&) {
cout << "bad_variant_access " << endl;
}
v = 3.14;
存的是整数的时候 用double去拿就会抛出异常