C++17

本文详细介绍了C++17的一些重要新特性,包括static_assert的可选文本信息、if语句中的初始化器、constexpr的编译期循环与递归、结构化绑定声明以及std::variant的使用。通过这些特性,开发者可以更高效、安全地编写C++代码。
摘要由CSDN通过智能技术生成

使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去拿就会抛出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#A#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值