2015-10-29 8 views
5

मैं एक मानचित्र में एक वस्तु बनाने की कोशिश कर रहा हूं जिसमें परमाणु है, इसलिए इसे कॉपी नहीं किया जा सकता है और न ही AFAICT को स्थानांतरित किया जा सकता है।मानचित्र में एक अप्रचलित वस्तु का निर्माण

सी ++ reference का मेरा पठन यह है कि नक्शा emplace ऐसा करने में सक्षम होना चाहिए। लेकिन निम्नलिखित कोड हटाए गए या अस्तित्वहीन रचनाकारों के कारण संकलित नहीं होता है। make_pair का उपयोग करने में मदद नहीं करता है।

#include <atomic> 
#include <unordered_map> 

class Z { 
    std::atomic<int> i; 
}; 

std::unordered_map<int, Z> map; 

void test(void) { 
    map.emplace(0, Z()); // error 
    map[0] = Z(); // error 
} 

क्या यह संभव है, और यदि नहीं, तो क्यों नहीं?

संपादित करें: संकलक लिनक्स

पर
+1

आप क्या संकलक प्रयोग करते हैं? – Drop

+2

'emplace' कन्स्ट्रक्टर तर्क लेता है, लेकिन आप एक अस्थायी वस्तु को पार कर रहे हैं। –

+0

@NeilKirk फिर कोई और नो-Arg कन्स्ट्रक्टर का आह्वान कैसे करेगा? –

उत्तर

13

map.emplace(std::piecewise_construct, std::make_tuple(0), std::make_tuple()) स्थान 0 में एक शून्य तर्क Z का निर्माण करेगी जीसीसी 4.8.1 है।

map[0] यह भी करेगा यदि यह पहले से मौजूद नहीं है।

emplacestd::pair<const K, V> बनाने के लिए तर्क लेता है। std::pair में std::piecewise_construct_t टैग किया गया कन्स्ट्रक्टर जो दो टुपल्स लेता है, पहला प्रयोग पहली तर्क बनाने के लिए किया जाता है, दूसरा दूसरा तर्क बनाने के लिए उपयोग किया जाता है।

तो std::pair<const int, Z> test(std::piecewise_construct, std::make_tuple(0), std::make_tuple())test एस तत्वों को स्थान पर बनाता है, const int(0) के साथ बनाया गया है। Z() के साथ बनाया गया है।

map.emplace आगे std::pair कन्स्ट्रक्टर के लिए तर्क है।

2

मानचित्र के अंदर मूल्य बनाने के लिए operator[] का उपयोग करना सबसे आसान समाधान है। फिर आप एक मान असाइन कर सकते हैं (या आवश्यकतानुसार इसे संचालित करें)।

-1

हो सकता है निम्न समाधान बेहतर होगा, के बाद से परमाणु नहीं copyable है:

class Z { 
    std::atomic<int> i; 
}; 

std::unordered_map<int, std::shared_ptr<Z>> map; 

void test(void) { 
    map.emplace(0, std::make_shared<Z>()); // OK 
} 
+0

'shared_ptr' का ओवरहेड गैर-तुच्छ है। –

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