3371. visit_format_arg and make_format_args are not hidden friends

Section: 28.5.8.1 [format.arg] Status: C++20 Submitter: Tim Song Opened: 2020-01-16 Last modified: 2021-02-25

Priority: 0

View all other issues in [format.arg].

View all issues with C++20 status.

Discussion:

After P1965R0, friend function and function template declarations always introduce hidden friends under the new blanket wording in 16.4.6.6 [hidden.friends]. However, 28.5.8.1 [format.arg] contains "exposition only" friend declarations of visit_format_arg and make_format_args, and those are not intended to be hidden. The only reason to have these declarations in the first place is because these function templates are specified using the exposition-only private data members of basic_format_arg, but that's unnecessary — for example, shared_ptr's constructors are not exposition-only friends of enable_shared_from_this, even though the former are shown as assigning to the latter's exposition-only weak_this private data member (see 20.3.2.2.2 [util.smartptr.shared.const]p1).

[2020-02-01 Status set to Tentatively Ready after five positive votes on the reflector.]

Proposed resolution:

This wording is relative to N4842.

  1. Edit 28.5.8.1 [format.arg], class template basic_format_arg synopsis, as indicated:

    namespace std {
      template<class Context>
      class basic_format_arg {
    
        […]
    
        template<class Visitor, class Ctx>
          friend auto visit_format_arg(Visitor&& vis,
                                       basic_format_arg<Ctx> arg);                  // exposition only
    
        template<class Ctx, class... Args>
          friend format-arg-store<Ctx, Args...>
            make_format_args(const Args&... args);                                  // exposition only
    
        […]
      };
    }