c++17 特性

C++17 标准一览

官方链接 https://en.cppreference.com/w/cpp/17

c++17 特性

1. c++17 移除特性

  • std::auto_ptr
  • register
  • bool 自增运算

2. c++17 deprecated

  • std::iterator
  • std::result_of

3. 语言新特性

3.1 u8

auto s1 = u8"你好";

3.2 noexcept

void f1() noexcept; // do not throw
void f2() noexcept(false) ; // may throw

3.3 新求值顺序 ?

3.4 lambda 可捕获 *this

// 通过捕获*this复制当前对象以备后续使用
[*this]() {
  // ...
}

3.5 constexpr 扩展

// constexpr 用于 if
if constexpr (...) {  // 编译期可计算

} else {

}

// constexpr 用于function
constexpr int func() {} // ....

3.5 变量扩展

  • 内联变量

  • 结构化绑定

  • if, switch 初始化变量

  if (auto it = m.find(10); it != m.end()) { 
    return it->second.size(); 
  }
  • 返回值不在支持copy方式, 即原本的rvo效果
  • int i = S().m;

3.6 模板扩展

  • fold
  template<typename... Args>
  bool all(Args... args) { return (... && args); }
  bool b = all(true, true, true, false);
  • CTAD 类模版参数推导, 不用再提前声明类型
  std::pair p(2, 4.5);     // deduces to std::pair<int, double> p(2, 4.5);
  std::tuple t(4, 3, 2.5); // same as auto t = std::make_tuple(4, 3, 2.5);
  std::less l;             // same as std::less<void> l;
  • 非类型模版参数支持auto
template<typename T, auto n> T get(std::array<T> v) {
  return v[n];
}

3.7 namespace 简化

// before c++17
namespace a {
  namespace b {
    namespace c {
      //...
    };
  };
};

// c++17
namespace a::b::c {

};

3.8 新的属性

  • [[fallthrough]] 用于 switch, 非空继续匹配选项的标记
  • [[maybe_unused]] 标记可能没有使用的实体(函数,结构体,类等)

3.9 __has_include

  • 检查是否已经include某些源文件

4. stl

4.1 std::any

std::any a = std::make_any<T>(t);
T x = std::any_cast<T>(a);

4.2 std::charconv

std::from_chars();
std::to_chars();

4.3 execution ???

4.4 filesystem

4.5 optional

4.6 string_view

4.7 variant

5. 算法

5.1 reduce

5.2 gcd

5.3 lcm