2016-10-14 6 views
8

सी में जीसीसी 6 ++ एक unique_ptr<T[]>::reset विधि की घोषणा/परिभाषा (नहीं एक है, कि केवल nullptr_t स्वीकार करता है) के बाद से इस तरह दिखता है:कार्यान्वयन :: unique_ptr <T[]> :: जीसीसी में रीसेट 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); 
    } 

यह किसी बिंदु पर N4089 लागू करने के लिए बदला गया था। कि दस्तावेज़ के अनुसार:

इस समारोह, प्राथमिक टेम्पलेट के रीसेट सदस्य के रूप में एक ही व्यवहार करती है सिवाय इसके कि यह अधिभार संकल्प में भाग नहीं ले जाएगा, जब तक या तो

-Upointer रूप में एक ही प्रकार है, या

- pointer एक ही प्रकार है element_type* के रूप में, U एक सूचक प्रकार V* है, और V(*)[]element_type(*)[] के लिए परिवर्तनीय है।

के निम्नलिखित उदाहरण पर विचार करें:

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

के बाद से संस्करण 6 जीसीसी एक त्रुटि पैदा करता है, शिकायत है कि यह const char*& और char*& साथ std::swap फोन नहीं कर सकते हैं। reset विधि अधिभार रिज़ॉल्यूशन में होती है क्योंकि char[]const char[] में परिवर्तनीय है, लेकिन स्वाभाविक रूप से std::swap उसी प्रकार के दो संदर्भों का इंतजार कर रहा है।

क्या यह एक सही व्यवहार माना जाता है? यदि हां, तो क्यों? अगर मैं char[] से const char[] में निहित रूप से परिवर्तित कर सकता हूं, तो unique_ptr के साथ ऐसा क्यों संभव नहीं होना चाहिए?

+3

एक जीसीसी बग, दायर की तरह लगता है [77,987] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77987) – Barry

+1

[जॉन Wakely] ऐसा लगता है (http://stackoverflow.com/users/981959/jonathan-wakely) पहले से ही इसे ठीक कर रहा है। – Barry

+0

ग्रीट! तो यह वास्तव में एक बग था। फाइलिंग के लिए Thx @ बैरी। मैं सवाल बंद कर रहा हूँ। – user7020241

उत्तर

0

तो यह वास्तव में gcc libstdC++ में एक बग प्रतीत होता है। @Barry यह बताया गया है: 77987

+2

यह उत्तर कुछ भी नहीं जो टिप्पणियों में पहले से था, जोड़ता है –

संबंधित मुद्दे