Structured Bindings
auto [iter, inserted] = my_map.insert({"key", 42});
if (inserted) { /* ... */ }
std::pair
, std::tuple
и пользовательскими типами.std::optional
nullptr
/специальных флагов:std::optional<int> parse_int(const std::string& s) {
if (s.empty()) return std::nullopt;
return std::stoi(s);
}
-1
или nullptr
для обозначения отсутствия значения.std::variant
и std::visit
std::variant<int, float, std::string> v = 3.14f;
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, float>) { /* ... */ }
}, v);
if constexpr
template<typename T>
auto serialize(const T& t) {
if constexpr (std::is_arithmetic_v<T>) {
return std::to_string(t);
} else {
return t.serialize();
}
}
Concepts
template<typename T>
concept Addable = requires(T a, T b) { { a + b } -> std::same_as<T>; };
template<Addable T>
T sum(T a, T b) { return a + b; }
Ranges
auto even_squares = views::iota(1)
| views::transform([](int x){ return x*x; })
| views::filter([](int x){ return x % 2 == 0; })
| views::take(10);
Coroutines
generator<int> range(int start, int end) {
for (int i = start; i < end; ++i)
co_yield i;
}
async/await
-подобных сценариев.std::format
printf
и stringstream:std::string message = std::format("Hello, {}! The answer is {}.", name, 42);
constexpr
improvements
try-catch
, аллокация памяти в compile-time:constexpr std::vector<int> build_vector() {
std::vector<int> v = {1, 2, 3};
v.push_back(4);
return v;
}
optional
, variant
, structured bindings) и метапрограммировании (if constexpr
).