C++17增加了数十项新特性,值得关注的特性大概有下面这些:
constexpr ifconstexpr lambdafold expressionvoid_tstructured bindingstd::apply, std::invokestring_viewparallel STLinline variable
1、fold expressionC++11增加了一个新特性可变模版参数(variadic template),它可以接受任意个模版参数在参数包中,参数包是三个点…,它不能直接展开,需要通过一些特殊的方法才能展开,导致在使用的时候有点难度。现在C++17解决了这个问题,让参数包的展开变得容易了,Fold expression就是方便展开参数包的。fold expression有4种语义:
unary right fold (pack op …)unary left fold (… op pack)binary right fold (pack op … op init)binary left fold (init op … op pack)其中pack代表变参,比如args,op代表操作符,fold expression支持32种操作符:
+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*
1.2、unary right fold
1.3、unary left fold
1.4、binary fold
1.5、comma fold
2、constexpr ifconstexpr标记一个表达式或一个函数的返回结果是编译期常量,它保证函数会在编译期执行。相比模版来说,实现编译期循环或递归,C++17中的constexpr if会让代码变得更简洁易懂。template<int N>constexpr int sum(){ return N;}
template <int N, int N2, int... Ns>constexpr int sum(){ return N + sum<N2, Ns...>();}
C++17之前你可能需要像上面这样写,但是现在你可以写更简洁的代码了。
template <int N, int... Ns>constexpr auto sum17(){ if constexpr (sizeof...(Ns) == 0) return N; else return N + sum17<Ns...>();}
3、constexpr lambdaconstexpr lambda其实很简单,它的意思就是可以在constexpr 函数中用lambda表达式了,这在C++17之前是不允许的。这样使用constexpr函数和普通函数没多大区别了,使用起来非常舒服。下面是constexpr lambda的例子:
template <typename I>constexpr auto func(I i) { //use a lambda in constexpr context return [i](auto j){ return i + j; }; }
4、string_viewstring_view的基本用法
C++17中的string_view是一个char数据的视图或者说引用,它并不拥有该数据,是为了避免拷贝,因此使用string_view可以用来做性能优化。你应该用string_view来代替const char和const string了。string_view的方法和string类似,用法很简单:
const char* data = "test";std::string_view str1(data, 4);std::cout<<str1.length()<<'\n'; //4if(data==str1) std::cout<<"ok"<<'\n';
const std::string str2 = "test";std::string_view str3(str2, str2.size());构造string_view的时候用char*和长度来构造,这个长度可以自由确定,它表示string_view希望引用的字符串的长度。因为它只是引用其他字符串,所以它不会分配内存,不会像string那样容易产生临时变量。
5、
转载于:https://www.cnblogs.com/shuang0109/p/9828992.html
相关资源:c++17 标准文档