Opened 6 years ago
Closed 6 years ago
#12920 closed Bugs (fixed)
movelib::unique_ptr: incorrect pointer type for nested array
| Reported by: | mkuron | Owned by: | Ion Gaztañaga |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | move |
| Version: | Boost 1.63.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
When attempting to use boost::movelib::unique_ptr to store an array of, for example, double[2], the type of the contained pointer ends up being double * instead of double (*)[2], resulting in conversion errors and the inability to use boost::movelib::unique_ptr for this purpose. std::unique_ptr behaves as expected, so evidently Boost's implementation does not fully match the standard one. It seems like remove_extent is used one too many times. Below is a short example:
#include <memory>
#include <functional>
#include <boost/move/unique_ptr.hpp>
using boost::movelib::unique_ptr;
typedef double C[2];
static_assert(std::is_same<unique_ptr<C[]>::pointer, C*>::value, "Pointer types must match");
static_assert(std::is_same<unique_ptr<C[]>::element_type, C>::value, "Element types must match");
int main() {
unique_ptr<C[], std::function<void(C *)> > p1;
unique_ptr<C[]> p2;
return 0;
}
Replace line 5 with using std::unique_ptr to see that it works with the standard library's unique_ptr.
Interestingly, as seen by the static_assert, only pointer has the wrong type; element_type is correct.
Tested with Boost 1.59 and 1.63 with Xcode 8.2.1 on Mac OS X 10.12 and GCC 6 on Linux.

Thanks for the report. Fixed in develop:
https://github.com/boostorg/move/commit/1dbc7bab5c421118c2e06c79f1994a04d23b40c3