This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++17 status.
unique_ptr<T[]>
from a nullptr
Section: 20.3.1.4.2 [unique.ptr.runtime.ctor] Status: C++17 Submitter: Ville Voutilainen Opened: 2015-07-19 Last modified: 2017-07-30
Priority: 2
View all issues with C++17 status.
Discussion:
According to the wording in 20.3.1.4.2 [unique.ptr.runtime.ctor]/1, this won't work:
unique_ptr<int[], DeleterType> x{nullptr, DeleterType{}};
U
is not the same type as pointer
, so the first bullet will not do.
U
is not a pointer type, so the second bullet will not do.
U
is the same type as pointer
, or
U
is nullptr_t
, or
pointer
is the same type as element_type*
, […]
[2015-10, Kona Saturday afternoon]
MC: Is it the right fix?
GR: It'd be awefully surprising if we had an interface that accepts null pointer values but not std::nullptr_t. I think the PR is good.
STL: Are any of the assignments and reset affected? [No, they don't operate on explicit {pointer, deleter} pairs.]
VV: This is already shipping, has been implemented, has been tested and works fine.
Move to Tentatively ready.
Proposed resolution:
This wording is relative to N4527.
Change 20.3.1.4.2 [unique.ptr.runtime.ctor] as indicated:
template <class U> explicit unique_ptr(U p) noexcept; template <class U> unique_ptr(U p, see below d) noexcept; template <class U> unique_ptr(U p, see below d) noexcept;-1- These constructors behave the same as the constructors that take a
pointer
parameter in the primary template except that they shall not participate in overload resolution unless either
U
is the same type aspointer
, or
U
isnullptr_t
, or
pointer
is the same type aselement_type*
,U
is a pointer typeV*
, andV(*)[]
is convertible toelement_type(*)[]
.