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();