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.

4399. 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.

The proposed wording has recently been implemented in gcc's libstdc++.

Proposed resolution:

This wording is relative to N5014.

  1. Modify 28.5.9 [format.tuple] as indicated:

    -1- For each of pair and tuple, the library provides the following formatter specialization where pair-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>> && ...);
    }