सी में जीसीसी 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 लागू करने के लिए बदला गया था। कि दस्तावेज़ के अनुसार:
इस समारोह, प्राथमिक टेम्पलेट के रीसेट सदस्य के रूप में एक ही व्यवहार करती है सिवाय इसके कि यह अधिभार संकल्प में भाग नहीं ले जाएगा, जब तक या तो
-
U
pointer
रूप में एक ही प्रकार है, या-
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
के साथ ऐसा क्यों संभव नहीं होना चाहिए?
एक जीसीसी बग, दायर की तरह लगता है [77,987] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77987) – Barry
[जॉन Wakely] ऐसा लगता है (http://stackoverflow.com/users/981959/jonathan-wakely) पहले से ही इसे ठीक कर रहा है। – Barry
ग्रीट! तो यह वास्तव में एक बग था। फाइलिंग के लिए Thx @ बैरी। मैं सवाल बंद कर रहा हूँ। – user7020241