std::formatted_size(3)

NAME
std::formatted_size - std::formatted_size

Synopsis
   Defined in header <format>
   template< class... Args >
   std::size_t formatted_size( /*format_string<Args...>*/ fmt, (1) (since C++20)
   Args&&... args );
   template< class... Args >
   std::size_t formatted_size( /*wformat_string<Args...>*/ fmt, (2) (since C++20)
   Args&&... args );
   template< class... Args >
   std::size_t formatted_size( const std::locale& loc, (3) (since C++20)
   /*format_string<Args...>*/ fmt, Args&&... args );
   template< class... Args >
   std::size_t formatted_size( const std::locale& loc, (4) (since C++20)
   /*wformat_string<Args...>*/ fmt, Args&&... args );
   Determine the total number of characters in the formatted string by formatting args
   according to the format string fmt. If present, loc is used for locale-specific
   formatting.
   The behavior is undefined if std::formatter<std::remove_cvref_t<Ti>, CharT> does not
   meet the BasicFormatter requirements for any Ti in Args.

Parameters
             parameter of unspecified type, whose initialization is valid only if the
             argument is convertible to std::string_view (for (1,3)) or
             std::wstring_view (for (2,4)), and the result of conversion is a constant
             expression and a valid format string for Args. The format string consists
             of
               * ordinary characters (except { and }), which are copied unchanged to
                 the output,
               * escape sequences {{ and }}, which are replaced with { and }
                 respectively in the output, and
               * replacement fields.
             Each replacement field has the following format:
             { arg-id (optional) } (1)
             { arg-id (optional) : format-spec } (2)
   fmt - 1) replacement field without a format specification
             2) replacement field with a format specification
                        specifies the index of the argument in args whose value is
                        to be used for formatting; if it is omitted, the arguments
             arg-id - are used in order.
                        The arg-ids in a format string must all be present or all be
                        omitted. Mixing manual and automatic indexing is an error.
             format-spec - the format specification defined by the std::formatter
                        specialization for the corresponding argument.
               * For basic types and standard string types, the format specification is
                 interpreted as standard format specification.
               * For chrono types, the format specification is interpreted as chrono
                 format specification.
               * For other formattable types, the format specification is determined by
                 user-defined formatter specializations.
   args... - arguments to be formatted
   loc - std::locale used for locale-specific formatting

Return value
   The total number of characters in the formatted string.

Exceptions
   Propagates any exception thrown by formatter.

Example
// Run this code
 #include <format>
 #include <iostream>
 #include <vector>
 #include <string_view>
 int main()
 {
     using namespace std::literals::string_view_literals;
     constexpr auto fmt_str { "Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv };
     constexpr auto sub_zero { "₀"sv }; // { "\u2080"sv } => { 0xe2, 0x82, 0x80 };
     constexpr auto aprox_equ { "≅"sv }; // { "\u2245"sv } => { 0xe2, 0x89, 0x85 };
     constexpr int Ho { 42 }; // H₀
     const auto min_buffer_size = std::formatted_size(fmt_str, sub_zero, aprox_equ, Ho);
     std::cout << "Min buffer size = " << min_buffer_size << '\n';
     // Use std::vector as dynamic buffer. Note: buffer does not include the trailing '\0'.
     std::vector<char> buffer(min_buffer_size);
     std::format_to_n(buffer.data(), buffer.size(), fmt_str, sub_zero, aprox_equ, Ho);
     std::cout << "Buffer: \"" << std::string_view{buffer.data(), min_buffer_size} << "\"\n";
     // Or we can print the buffer directly by adding the trailing '\0'.
     buffer.push_back('\0');
     std::cout << "Buffer: \"" << buffer.data() << "\"\n";
 }

Output:
 Min buffer size = 37
 Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."
 Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."
  Defect reports
   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.
     DR Applied to Behavior as published Correct behavior
                      throws std::format_error for invalid invalid format string
   P2216R3 C++20 format string results in compile-time
                        error
                      objects that are neither const-usable nor
   P2418R2 C++20 copyable allow formatting these
                      (such as generator-like objects) are not objects
                      formattable

See also
   format_to writes out formatted representation of its arguments through an output
   (C++20) iterator
               (function template)
   format_to_n writes out formatted representation of its arguments through an output
   (C++20) iterator, not exceeding specified size
               (function template)