С какими стандартами C++ вы работали?

«С какими стандартами C++ вы работали?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я имел коммерческий опыт работы со стандартами C++11, C++14, C++17 и в последнее время с некоторыми возможностями C++20. Основной production-код в текущем проекте написан с фокусом на C++17.

Ключевые возможности, которые я активно использовал из каждого стандарта:

  • C++11: Автоматическое определение типов (auto), range-based for loops, умные указатели (unique_ptr, shared_ptr), лямбда-выражения, move-семантика и rvalue-ссылки (&&), std::thread для многопоточности.

    // C++11: auto, lambda, unique_ptr
    auto processor = std::make_unique<DataProcessor>();
    std::vector<int> vec = {1, 2, 3};
    std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; });
  • C++14: Обобщенные лямбды (auto в параметрах), std::make_unique, бинарные литералы.

    // C++14: generic lambda
    auto adder = [](auto a, auto b) { return a + b; };
  • C++17: Наиболее часто используемый в моих проектах. Критически важные фичи:

    • Structured Bindings для удобной распаковки кортежей и структур.
    • std::optional, std::variant, std::any для выражения nullable типов, типобезопасных объединений и любого типа.
    • std::filesystem для кроссплатформенной работы с файлами.
    • constexpr if для условной компиляции в шаблонах.
    • Вложенные namespace'ы (namespace A::B::C).
      // C++17: structured binding, optional, filesystem
      std::optional<int> find_id(const std::string& name);
      auto [id, success] = db.lookup("key"); // возвращает std::pair
      for (const auto& entry : std::filesystem::directory_iterator("./logs")) { /*...*/ }
  • C++20: Начинаю применять в новых модулях. Наиболее интересные возможности:

    • Concepts для улучшения читаемости шаблонов и качества сообщений об ошибках.
    • Ranges для более выразительных и комбинируемых операций с последовательностями.
    • Coroutines для асинхронного программирования (пока на стадии экспериментов).
      
      // C++20: concepts (упрощенно)
      template<typename T>
      concept Numeric = std::is_arithmetic_v<T>;

template T square(T x) { return x * x; }



Для встраиваемых систем с ограниченным компилятором иногда приходилось использовать стандарт **C++03** или даже **C99**, но я всегда стремлюсь использовать максимально современный стандарт, доступный на целевой платформе, для повышения безопасности и выразительности кода.