C++17的最终亮点
std::variant(变体)
让我们从最让我惊讶的地方开始:变体。是的,严肃的说,C++17带来了std::variant。这太棒了,并且为将来基于变体和其他相关想法的特征铺平了道路。例如,样式匹配,C++上关于这个有一个非常好的谈话。根据David Sankel所说,std::variant是按照boost::variant和或其他variant库进行设计的。与boost::variant有非常相似的API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
variant< int , float > v, w;
v = 12;
int i = get< int >(v);
w = get< int >(v);
w = get<0>(v);
w = v;
get< double >(v);
get<3>(v);
try {
get< float >(w);
}
catch (bad_variant_access&) {}
|
能看到这个特征收录到了C++17标准中,而不是采用TS detour,非常高兴。
if constexpr(expression)
这是static if的C++版本(差不多)。对于我来说这是Jacksonville的亮点之一,那时,这并没有让它采用。不负众望,它通过了Oulu对于C++17的最终回顾。有了它,如果在编译过程中,一个constexpr被评估为真,C++可以轻松的让某些语句块编译:
1
2
3
|
if constexpr (std::is_integer ...) {
else if constexpr (std::is_floating_point ...) {
else {
|
这个例子显式的说明了,constexpr必须在编译中被判断为真,但是对于static_assert没有影响。语句块中没被选定的static_assert仍然会触发。这对于标准来说是不恰当的。
还有一个有趣的地方:这个特征写为if constexpr,但是标准的拼写仍然将其命名为constexpr if,但是将它定义为了if constexpr。