Một số mở rộng của C++20 so với C++11


Tổng quan các điểm nổi bật của C++20 so với C++11:

1. Concepts – Kiểm tra ràng buộc kiểu trong template

  • C++11: Template không có cách rõ ràng để ràng buộc kiểu; lỗi thường xảy ra khó hiểu khi sử dụng sai kiểu.
  • C++20: Thêm concepts để giới hạn kiểu template rõ ràng hơn.

cpp

CopyEdit

template<typename T>

concept Integral = std::is_integral_v<T>;

 

template<Integral T>

T add(T a, T b) { return a + b; }


2. Ranges library – Xử lý dãy giá trị hiện đại

  • C++11: Phải dùng kết hợp nhiều vòng lặp/phép toán với iterator thủ công.
  • C++20: ranges giúp code ngắn gọn, dễ đọc hơn.

cpp

CopyEdit

#include <ranges>

std::vector<int> v = {1,2,3,4,5};

auto evens = v | std::views::filter([](int n){ return n % 2 == 0; });


3. Coroutines – Hỗ trợ lập trình bất đồng bộ tự nhiên

  • C++11: Không có coroutine; lập trình async phải dùng std::async, std::future.
  • C++20: Hỗ trợ co_await, co_yield, co_return.

cpp

CopyEdit

task<int> compute() {

    co_return 42;

}


4. Modules – Thay thế tiền xử lý #include

  • C++11: Dùng #include gây chậm biên dịch, phụ thuộc chồng chéo.
  • C++20: Thêm module giúp biên dịch nhanh hơn, tránh include vòng.

cpp

CopyEdit

export module math;

// implementation


5. Constexpr mạnh hơn

  • C++11: constexpr chỉ cho các hàm đơn giản.
  • C++20: Cho phép nhiều lệnh phức tạp hơn trong constexpr, kể cả vòng lặp, khối lệnh, try-catch.

6. Three-way comparison (<=>) – Toán tử so sánh tàu vũ trụ

  • C++11: Phải viết thủ công tất cả toán tử <, ==, >, v.v.
  • C++20: Toán tử <=> giúp tự động sinh các phép so sánh.

cpp

CopyEdit

auto result = a <=> b;

if (result < 0) { ... }


7. Improved Lambdas

  • C++11: Lambda đơn giản, không có template trong lambda.
  • C++20:
    • Lambda có thể là template.
    • Cho phép constexpr, default, requires, etc.

cpp

CopyEdit

auto lambda = []<typename T>(T a, T b) { return a + b; };


8. New std::format – Format chuỗi giống Python

  • C++11: Dùng stringstream hoặc printf.
  • C++20: Thêm std::format.

cpp

CopyEdit

std::string msg = std::format("Hello {}!", "world");


9. Calendar & Timezone trong <chrono>

  • C++11: Chỉ hỗ trợ thời gian đơn giản.
  • C++20: Hỗ trợ xử lý ngày tháng, múi giờ đầy đủ.

10. Others:

  • [[likely]], [[unlikely]] → gợi ý cho compiler nhánh thường xảy ra.
  • consteval → bắt buộc tính toán lúc compile-time.
  • std::span<T> → thao tác mảng như view an toàn.
  • init-statement trong if, switch.