2016-09-12 20 views
12

मुझे लगता है कि std::map और std::unordered_map की insert विधि इन के लिए सेstd :: में नक्शा :: डालने परिवर्तन सी ++ 17

template<class P> std::pair<iterator,bool> insert(P&& value); (C++11) 

std::pair<iterator,bool> insert(value_type&& value); (C++17) 

को बदलने के लिए हालांकि, जा रहा है कंटेनर, value_typestd::pair<A const, int> है। यहां दो प्रश्न:

  1. यह परिवर्तन क्यों? उल्टा क्या है?
  2. यह सम्मिलन पर कुंजी को स्थानांतरित करने के लिए कैसे काम करेगा? सी ++ 11 संस्करण कुछ भी स्वीकार करता है (P पर बाधा default_constructible<value_type, P&&> है), फिर std::pair<A, int> - जो कि इस तर्क के प्रकार के अधिकांश समय है क्योंकि यह std::make_pair द्वारा लौटाया गया है - और A के चालक कन्स्ट्रक्टर को कॉल कर सकता है। लेकिन सी ++ 17 संस्करण में, यह तर्क value_type पर डाला गया है, जहां A कॉन्स है, फिर गैर-चलने योग्य है। अगर मुझे कुछ दिखाई नहीं दे रहा है, तो मुझे कॉपी करना होगा। या सी ++ 17 उस तरफ कुछ भी बदलता है?

धन्यवाद!

+3

ऐसा लगता है कि उस सुविधा को [LWG 2354] (http://wg21.link/lwg2354) द्वारा जोड़ा गया था। –

+7

यह "एक्स से वाई" नहीं है। यह एक अतिरिक्त अधिभार है। –

उत्तर

9

insert पर एक अतिरिक्त गैर-टेम्पलेट अधिभार C++ 17 में जोड़ा गया था।

इस तरह के अधिभार का लाभ यह है कि यह .insert({ {key}, {value, args} }) वाक्यविन्यास - {} आधारित निर्माण की अनुमति देता है। template तर्कों को बिना किसी स्पष्ट प्रकार के {} आधारित निर्माण निर्देशों को पारित नहीं किया जा सकता है।

+0

धन्यवाद; वास्तव में यह एक अतिरिक्त अधिभार है जो इस '{}' आधारित निर्माण को लिखने की अनुमति देगा, लेकिन इसे अभी भी 'std :: pair 'के रूप में माना जाएगा, इसलिए मुझे लगता है कि आपके उदाहरण में' कुंजी 'जीता स्थानांतरित नहीं किया जाएगा लेकिन कॉपी किया गया ...? मैं वास्तव में बहुत यकीन करता हूं कि सी ++ लोगों ने इसके बारे में सोचा और इसे स्थानांतरित कर दिया जाएगा, मैं नहीं देखता * कैसे * अगर यह स्थिर है :) – AntiClimacus

+0

@ एंटी क्लिमाकस यह 'std :: pair' के रचनाकारों को कॉल करेगा, जो भी वे कर रहे हैं। यदि 'std :: pair 'का निर्माण (कहें)' (Key &&, Value &&) 'द्वारा किया जा सकता है, तो डेटा को' insert 'में स्थानांतरित किया जा सकता है। हालांकि, पेड़ में डेटा में स्थानांतरित नहीं किया जा सका, हां। – Yakk

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