Tiêu chuẩn C++ cập nhật mỗi 3 năm. C++17 mang lại nhiều tính năng làm code gọn, sạch, an toàn hơn. Dưới đây là các tính năng nổi bật:
1. Fold Expressions (Biểu thức gấp)
Cho phép xử lý pack tham số biến đổi (variadic template) ngắn gọn.
- Unary right fold:
(pack op ...) - Unary left fold:
(... op pack) - Binary left fold:
(init op ... op pack) - Binary right fold:
(pack op ... op init)
pack là parameter pack, op là toán tử (+, -, *, /, <=, ...), init là giá trị khởi tạo.
template<typename ...Args>
auto addition(Args ...args) {
return (args + ... + 0); // Binary left fold
}
template<typename ...Args>
auto sum2(Args ...args) {
return (args + ...); // Unary right fold
}
int main() {
cout << "Sum: " << addition(1,1,1,1,1) << endl; // 5
cout << "Sum2: " << sum2(1,2,3) << endl; // 6
}
2. Structured Bindings (Ràng buộc cấu trúc)
Khởi tạo nhiều biến từ tuple, pair, struct, array trong 1 câu lệnh.
- Mảng:
int a[3]={3,4,5}; auto [x,y,z]=a;→ x=3,y=4,z=5. - Tuple-like:
auto& [p,q,r] = tuple;ràng buộc reference. - Data members:
const auto [a,b] = func();với struct có bit-field, volatile.
3. Khởi tạo enum bằng danh sách trực tiếp
enum byte : unsigned char {};
byte b0 {0}; // OK
byte b1 = byte{1}; // OK
byte b2 = byte{256}; // ERROR (0-255)
4. Khai báo biến trong if/switch
if (auto it = map.find(key); it != map.end()) { ... }
switch (auto x = getValue(); x) { ... }
Biến chỉ tồn tại trong scope của if/switch.
5. if constexpr (Đánh giá tại compile-time)
Dùng trong template để loại bỏ nhánh không dùng ở compile-time.
template <typename T>
auto length(T const& value) {
if constexpr (is_integral_v<T>) return value;
else return value.length();
}
6. Nested Namespaces (Namespace lồng nhau đơn giản)
// C++17
namespace Earth::Continent::Country {
class City { ... };
}
Thay cho cú pháp cũ lồng nhiều cấp namespace A { namespace B { ... } }.