Расскажите о фичах, которые появились в разных версиях языка.cplus-73

C++98/03: Основа языка

  1. STL (Standard Template Library)

    • Контейнеры (vector, map), алгоритмы (sort, find), итераторы.
    std::vector<int> v = {3, 1, 4};
    std::sort(v.begin(), v.end());
    
  2. Шаблоны (Templates)

    • Обобщенное программирование:
    template<typename T>
    T max(T a, T b) { return a > b ? a : b; }
    

C++11: Первая большая модернизация

  1. Автоматический вывод типов (auto)

    auto x = 42; // int
    
  2. Лямбда-выражения

    std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
    
  3. Умные указатели (unique_ptr, shared_ptr)

    std::unique_ptr<MyClass> ptr(new MyClass());
    
  4. Move-семантика

    std::vector<std::string> v1;
    std::vector<std::string> v2 = std::move(v1); // Быстрое перемещение
    

C++14: Уточнения и улучшения

  1. Обобщенные лямбды

    auto generic_lambda = [](auto x, auto y) { return x + y; };
    
  2. constexpr расширения

    constexpr int factorial(int n) {
        return n <= 1 ? 1 : n * factorial(n - 1);
    }
    

C++17: Удобство и выразительность

  1. Structured bindings

    auto [key, value] = std::make_pair("id", 42);
    
  2. std::optional

    std::optional<int> find(int id) { /* ... */ }
    
  3. if constexpr

    template<typename T> auto process(T val) {
        if constexpr (std::is_integral_v<T>) { /* ... */ }
    }
    

C++20: Крупные нововведения

  1. Concepts

    template<typename T>
    concept Addable = requires(T a, T b) { a + b; };
    
  2. Ranges

    auto result = numbers | std::views::filter(is_even) 
                         | std::views::transform(square);
    
  3. Coroutines

    generator<int> range(int start, int end) {
        for (int i = start; i < end; ++i)
            co_yield i;
    }
    

C++23: Ожидаемые новинки

  1. std::mdspan - многомерные массивы
  2. std::print - улучшенный вывод
  3. Deducing this - упрощение CRTP

Резюмируем

Эволюция C++ идет по пути:

  • Повышение выразительности (лямбды, ranges)
  • Улучшение безопасности (умные указатели, optional)
  • Упрощение сложных задач (корутины, concepts)
  • Расширение возможностей метапрограммирования (constexpr, шаблоны)

Каждая версия сохраняет обратную совместимость, добавляя современные возможности. C++20 можно считать поворотным моментом, когда язык стал значительно удобнее без потери производительности.