This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Tentatively NAD status.

### 3667. `std::cout << &X::f` prints `1`

Section: 29.7.5.3 [ostream.formatted] Status: Tentatively NAD Submitter: Peter Dimov Opened: 2022-01-31 Last modified: 2022-02-05

Priority: Not Prioritized

View all issues with Tentatively NAD status.

Discussion:

At present, the program

>     #include <iostream>

>     struct X
>     {
>       void f() {}
>     };

>     int main()
>     {
>       std::cout << &X::f;
>     }

prints `1`. That's because member pointers implicitly convert to `bool`, and there's `operator<<` overload for `bool` in 29.7.5.3.2 [ostream.inserters.arithmetic].

This behavior is rarely useful. In C++20, we added deleted overloads to prevent a similar counter-intuitive output for the case in which e.g. `L"str"` is output to `std::cout`, which used to print the pointer value using the `operator<<` overload for `const void*`.

We should similarly consider adding a deleted overload for member pointers.

[2022-03-04; Reflector poll; Status changed: New → Tentatively NAD]

Needs a paper to LEWG if anything should change here.

Proposed resolution:

This wording is relative to N4901.

1. Modify 29.7.5.2.1 [ostream.general], class template `basic_ostream` synopsis, as indicated:

   >     namespace std {
   >       […]

   >       template<class traits>
   >         basic_ostream<wchar_t, traits>&
   >           operator<<(basic_ostream<wchar_t, traits>&, const char16_t*) = delete;
   >       template<class traits>
   >         basic_ostream<wchar_t, traits>&
   >           operator<<(basic_ostream<wchar_t, traits>&, const char32_t*) = delete;

   >       template<class charT, class traits, class T, class C>
   >         basic_ostream<charT, traits>&
   >           operator<<(basic_ostream<charT, traits>&, T C::*) = delete;
   >     }