निम्नलिखित कोड पर विचार करें, जी ++ 7.0.1 के साथ संकलित उपयोग करने के लिए (-std = C++ 17):std :: टपल के नक्शे टपल और क़ायम करना
#include <map>
#include <tuple>
int main()
{
// Create an alias for a tuple of three ints
using ThreeTuple=std::tuple<int,int,int>;
// Create an alias for a map of tuple to tuple (of three ints)
using MapThreeTupleToThreeTuple=std::map<ThreeTuple,ThreeTuple>;
MapThreeTupleToThreeTuple m;
// The following does NOT compile
m.emplace({1,2,3},{4,5,6});
// ..., and neither does this
m.emplace(std::piecewise_construct,{1,2,3},{4,5,6});
}
मैं सोचा होगा कि initializer_list
तर्क map::emplace()
तक पर्याप्त होगा और इसके परिणामस्वरूप निर्दिष्ट मूल्य के रूप में मूल्य संघ को टुपल करने के लिए टुपल कुंजी को सम्मिलित किया जाएगा। जाहिर है, संकलक असहमत है।
(यानी, के बजाय ThreeTuple{1,2,3}
सिर्फ {1,2,3}
) और गुजर कि स्वचालित रूप से टपल कंस्ट्रक्टर्स करने के लिए उन्हें आगे हैं जो map::emplace()
समस्या का हल, लेकिन क्यों प्रारंभकर्ता सूचियों map::emplace()
को सीधे पारित नहीं किया जा सकता है ?
आरंभकर्ता सूचियों में कोई प्रकार नहीं है। 'emplace' टाइप कटौती पर निर्भर करता है। आप एक टाइपलेस चीज़ के लिए एक प्रकार को कम नहीं कर सकते हैं। – NathanOliver
आपको इस मुद्दे के बारे में सी ++ 17 में क्या लगता है? – Walter
@ वाल्टर, मेरा मतलब यह नहीं था कि मैं एक नई सी ++ 17 सुविधा का उपयोग कर रहा हूं, बस मैं सी ++ 17 संगतता स्तर का उपयोग कर रहा था। –