Raw string literals, u16/u32 literals, std::to_string. Conversion and formatting remain split across iostreams, sprintf and stoi — the weak spot of the era.
const char* re = R"((d+)-(d+))"; // raw literal: no escape soup
string_view rules, to_chars, format/print, encodings.
Raw string literals, u16/u32 literals, std::to_string. Conversion and formatting remain split across iostreams, sprintf and stoi — the weak spot of the era.
const char* re = R"((d+)-(d+))"; // raw literal: no escape soup
"..."s literals from std::string_literals; heterogeneous lookup starts removing temporary-string churn around containers.
std::string_view changes every read-only signature (with the dangling rule: never store one past the owner), and to_chars/from_chars finally give locale-free, non-throwing, fast numeric conversion.
int value{};
auto [p, ec] = std::from_chars(s.data(), s.data() + s.size(), value);
if (ec != std::errc{}) fail();
starts_with/ends_with, char8_t separates UTF-8 from char, and std::format replaces the iostream/sprintf split with type-safe, extensible formatting.
auto line = std::format("{:>8} | {:.2f}", name, ratio);
contains, resize_and_overwrite (write into a string without zero-fill), formatting ranges directly, and std::print/println as the output endpoint.
std::println("lanes = {}", std::vector{1, 2, 3}); // ranges format (C++23)
std::text_encoding names and queries the literal/runtime encodings — the first standard vocabulary for the encoding question that was previously all convention.
Direction: deeper Unicode support (proper text segmentation/transcoding APIs) remains SG16's declared long-term goal.
C++26 per the final working draft; C++29 rows are proposals and direction, not adopted features.