2016-10-14 22 views
8

Kể từ GCC 6 trong C++ khai báo/định nghĩa của một phương pháp unique_ptr<T[]>::reset (không phải là người, mà chỉ chấp nhận nullptr_t) trông như thế này:Thực hiện std :: unique_ptr <T[]> :: reset trong gcc 6

template <typename _Up, 
      typename = _Require< 
       __or_<is_same<_Up, pointer>, 
        __and_<is_same<pointer, element_type*>, 
          is_pointer<_Up>, 
          is_convertible< 
          typename remove_pointer<_Up>::type(*)[], 
          element_type(*)[] 
          > 
        > 
       > 
      >> 
    void 
    reset(_Up __p) noexcept 
    { 
using std::swap; 
swap(std::get<0>(_M_t), __p); 
if (__p != nullptr) 
    get_deleter()(__p); 
    } 

Điều này đã được thay đổi tại một số thời điểm để triển khai N4089. Theo tài liệu mà:

chức năng này hoạt động giống như các thành viên reset của mẫu ban đầu, ngoại trừ việc nó sẽ không tham gia vào giải quyết tình trạng quá tải trừ khi một trong hai

-U là loại giống như pointer, hoặc

-pointer là loại giống như element_type*, U là một loại con trỏ V*, và V(*)[] là mui trần để element_type(*)[].

Hãy xem xét ví dụ sau:

std::unique_ptr<const char []> ptr1; 
std::unique_ptr<char []> ptr2(new char[5]); 
ptr1 = std::move(ptr2); 

Kể từ phiên bản 6 GCC tạo ra một lỗi, phàn nàn rằng nó không thể gọi std::swap với const char*&char*&. Phương pháp reset diễn ra ở độ phân giải quá tải là char[] có thể chuyển đổi thành const char[], nhưng tự nhiên std::swap đang chờ hai tham chiếu cùng loại.

Đây có phải là hành vi đúng không? Nếu có thì tại sao? Nếu tôi có thể chuyển đổi hoàn toàn char[] thành const char[], tại sao bạn không thể thực hiện tương tự với unique_ptr?

+3

Có vẻ như lỗi gcc, được gửi [77987] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77987) – Barry

+1

Có vẻ như [Jon Wakely] (http://stackoverflow.com/users/981959/jonathan-wakely) đã được sửa chữa nó. – Barry

+0

Greate! Vì vậy, nó thực sự là một lỗi. Thx @Barry để nộp đơn. Tôi đang đóng câu hỏi. – user7020241

Trả lời

0

Vì vậy, điều này thực sự có vẻ là một lỗi trong gcc libstdC++. @Barry đã báo cáo: 77987

+2

câu trả lời này không thêm gì vào những gì đã có trong nhận xét –

Các vấn đề liên quan