C++17 新特性详解:相较于 C++14 的主要改进
·
C++17 新特性详解:相较于 C++14 的主要改进
C++17 是 C++ 编程语言的一个重要版本,虽然不像 C++11 或 C++20 那样革命性,但引入了许多实用的改进。以下是 C++17 相较于 C++14 的主要变化:
一、语言核心特性
1. 结构化绑定(Structured Bindings)
std::pair<int, std::string> p{42, "hello"};
auto [num, str] = p; // 直接解包pair/tuple/struct
std::map<int, std::string> m = {{1, "one"}, {2, "two"}};
for (const auto& [key, value] : m) { // 遍历map更简洁
std::cout << key << ": " << value << "\n";
}
2. if/switch 初始化语句
if (auto it = m.find(1); it != m.end()) { // if带初始化
std::cout << it->second << "\n";
}
switch (int x = get_value(); x) { // switch带初始化
case 1: /*...*/ break;
case 2: /*...*/ break;
}
3. 内联变量(Inline Variables)
// 头文件中
inline int global_var = 42; // 避免多重定义错误
struct S {
static inline int value = 10; // 类内静态成员初始化
};
4. 折叠表达式(Fold Expressions)
template <typename... Args>
auto sum(Args... args) {
return (... + args); // 展开参数包
}
int total = sum(1, 2, 3, 4, 5); // 15
5. if constexpr
template <typename T>
auto get_value(T t) {
if constexpr (std::is_pointer_v<T>) { // 编译时条件判断
return *t;
} else {
return t;
}
}
6. 自动推导模板参数(Class Template Argument Deduction)
std::pair p(1, "hello"); // 自动推导为std::pair<int, const char*>
std::vector v{1, 2, 3}; // 自动推导为std::vector<int>
7. 嵌套命名空间定义
namespace A::B::C { // 替代原来的namespace A { namespace B { namespace C {
int x;
}
二、标准库增强
1. 文件系统库(std::filesystem)
#include <filesystem>
namespace fs = std::filesystem;
fs::path p = "/path/to/file";
if (fs::exists(p)) {
std::cout << "File size: " << fs::file_size(p) << "\n";
}
2. 并行STL算法
#include <algorithm>
#include <execution>
std::vector<int> v = {...};
std::sort(std::execution::par, v.begin(), v.end()); // 并行排序
3. std::optional
#include <optional>
std::optional<int> find(int key) {
if (/* 找到 */) return value;
return std::nullopt; // 表示无值
}
if (auto val = find(42)) {
std::cout << *val << "\n";
}
4. std::variant
#include <variant>
std::variant<int, double, std::string> v;
v = 3.14; // 存储double
v = "hello"; // 存储string
std::visit([](auto&& arg) { // 访问variant
std::cout << arg << "\n";
}, v);
5. std::any
#include <any>
std::any a = 42;
a = std::string("hello");
if (a.type() == typeid(int)) {
std::cout << std::any_cast<int>(a) << "\n";
}
6. std::string_view
#include <string_view>
void process(std::string_view sv) { // 不拥有字符串数据
std::cout << sv.substr(0, 5) << "\n";
}
process("Hello world"); // 不需要构造std::string
process(std::string("test"));
7. 数学特殊函数
#include <cmath>
double bessel = std::cyl_bessel_j(1, 1.234);
double legendre = std::legendre(2, 0.5);
三、其他重要特性
1. 强制省略拷贝(Guaranteed Copy Elision)
struct NonCopyable {
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
};
NonCopyable make() {
return NonCopyable{}; // C++17保证不会发生拷贝
}
auto obj = make(); // 即使没有拷贝构造函数也能工作
2. 更严格的表达式求值顺序
std::cout << f() << g() << h(); // C++17: f,g,h调用顺序确定
foo(bar(), baz()); // bar在baz前调用
3. 十六进制浮点字面量
double x = 0x1.2p3; // 1.2(十六进制) × 2³ = 9.0
4. 属性增强
[[maybe_unused]]: 抑制未使用警告[[nodiscard]]: 警告未使用返回值[[fallthrough]]: 标记switch中故意不写break的情况
四、总结
C++17 的主要改进包括:
- 语法糖:结构化绑定、
if初始化、嵌套命名空间等使代码更简洁 - 模板增强:折叠表达式、
if constexpr简化模板元编程 - 新容器:
std::optional/std::variant/std::any提供更安全的类型选择 - 文件系统:标准化的跨平台文件操作
- 并行STL:利用多核处理器加速算法
- 性能保证:强制省略拷贝、确定求值顺序等
虽然不像 C++11 那样革命性,但 C++17 提供了许多实用的改进,使日常编码更加方便和安全。
更多推荐
所有评论(0)