Title
`enable_nonlocking_formatter_optimization` for `pair` and `tuple` needs `remove_cvref_t`
Status
new
Section
[format.tuple]
Submitter
Tomasz Kamiński

Created on 2025-10-02.00:00:00 last changed 1 week ago

Messages

Date: 2025-10-04.11:36:03

Proposed resolution:

This wording is relative to N5014.

  1. Modify [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>> && ...);
    }
    
Date: 2025-10-04.12:19:20

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

History
Date User Action Args
2025-10-04 11:36:03adminsetmessages: + msg15116
2025-10-02 00:00:00admincreate