2948. unique_ptr does not define operator<< for stream output

Section: 20.3.1 [unique.ptr] Status: C++20 Submitter: Peter Dimov Opened: 2017-03-19 Last modified: 2021-02-25

Priority: 0

View all other issues in [unique.ptr].

View all issues with C++20 status.

Discussion:

shared_ptr does define operator<<, and unique_ptr should too, for consistency and usability reasons.

[2017-07 Toronto Wed Issue Prioritization]

Priority 0; move to Ready

Proposed resolution:

This wording is relative to N4659.

  1. Change 20.2.2 [memory.syn], header <memory> synopsis, as indicated:

    namespace std {
      […]
      
      // 20.3.1 [unique.ptr], class template unique_ptr
      […]
      template <class T, class D>
      bool operator>=(nullptr_t, const unique_ptr<T, D>& y);
      
      template<class E, class T, class Y, class D>
      basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, const unique_ptr<Y, D>& p);
      […]
    }
    
  2. Change 20.3.1 [unique.ptr], class template unique_ptr synopsis, as indicated:

    namespace std {
      […]
      template <class T, class D>
      bool operator>=(nullptr_t, const unique_ptr<T, D>& y);
      
      template<class E, class T, class Y, class D>
      basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, const unique_ptr<Y, D>& p);
    }
    
  3. Add a new subclause following subclause 20.3.1.6 [unique.ptr.special] as indicated:

    23.11.1.?? unique_ptr I/O [unique.ptr.io]

    template<class E, class T, class Y, class D>
      basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, const unique_ptr<Y, D>& p);
    

    -?- Effects: Equivalent to os << p.get();

    -?- Returns: os.

    -?- Remarks: This function shall not participate in overload resolution unless os << p.get() is a valid expression.