unique_ptr does not define operator<< for stream outputSection: 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.
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);
[…]
}
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);
}
Add a new subclause following subclause 20.3.1.6 [unique.ptr.special] as indicated:
23.11.1.??
unique_ptrI/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
-?- Returns:os << p.get();os. -?- Remarks: This function shall not participate in overload resolution unlessos << p.get()is a valid expression.