This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.
enable_nonlocking_formatter_optimization
for pair
and tuple
needs remove_cvref_t
Section: 28.5.9 [format.tuple] Status: New Submitter: Tomasz KamiĆski Opened: 2025-10-02 Last modified: 2025-10-04
Priority: Not Prioritized
View all issues with New status.
Discussion:
The enable_nonlocking_formatter_optimization
variable template is specialized only for cv-unqualified
types. However, the specialization for pair
and tuple
does not remove the references and
cv-qualifiers from the elements:
template<class... Ts> constexpr bool enable_nonlocking_formatter_optimization<pair-or-tuple<Ts...>> = (enable_nonlocking_formatter_optimization<Ts> && ...);
As consequence pair<const std::string, int>
or
pair<const std::string&, int&>
(map
and flat_map
reference types)
will not use unbuffered prints.
Proposed resolution:
This wording is relative to N5014.
Modify 28.5.9 [format.tuple] as indicated:
-1- For each of
pair
andtuple
, the library provides the following formatter specialization wherepair-or-tuple
is the name of the template:namespace std { […] template<class... Ts> constexpr bool enable_nonlocking_formatter_optimization<pair-or-tuple<Ts...>> = (enable_nonlocking_formatter_optimization<remove_cvref_t<Ts>> && ...); }