This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Tentatively Ready status.
enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_tSection: 28.5.9 [format.tuple] Status: Tentatively Ready Submitter: Tomasz KamiĆski Opened: 2025-10-02 Last modified: 2025-10-17
Priority: Not Prioritized
View all issues with Tentatively Ready 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.
[2025-10-17; Reflector poll]
Set status to Tentatively Ready after seven votes in favour during reflector poll.
Proposed resolution:
This wording is relative to N5014.
Modify 28.5.9 [format.tuple] as indicated:
-1- For each of
pairandtuple, the library provides the following formatter specialization wherepair-or-tupleis 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>> && ...); }