निम्नलिखित कोड जीसीसी 4.7.2 या बजना 3.2 में संकलन नहीं करता है:वर्दी प्रारंभिकरण का उपयोग कर std :: vector <std :: function <void()>> कॉपी नहीं कर सकता। क्या ये सही है?
#include <vector>
#include <functional>
int main()
{
std::vector<std::function<void()>> a;
std::vector<std::function<void()>> b{a};
}
मुद्दा है कि संकलक, एक initializer_list का उपयोग करते समय स्पष्ट रूप से यह सिर्फ नकल निर्माता बुला जाना चाहिए ख बनाने की कोशिश करेंगे। हालांकि यह वांछित व्यवहार प्रतीत होता है क्योंकि मानक कहता है कि प्रारंभकर्ता_सूची रचनाकारों को प्राथमिकता लेनी चाहिए।
यह कोड अन्य std :: vector के लिए ठीक काम करेगा, लेकिन std :: function के लिए संकलक यह नहीं जान सकता कि आप प्रारंभकर्ता_सूची निर्माता या किसी अन्य को चाहते हैं या नहीं।
ऐसा लगता है कि इसके चारों ओर एक रास्ता नहीं है, और यदि ऐसा है तो आप कभी भी टेम्पलेट कोड में वर्दी प्रारंभिक उपयोग नहीं कर सकते हैं। जो एक विशाल शर्म की बात होगी।
दूसरी तरफ विजुअल स्टूडियो (2012 नवंबर सीटीपी) इस बारे में शिकायत नहीं करता है। लेकिन इस समय प्रारंभकर्ता_सूची समर्थन बहुत अच्छा नहीं है, इसलिए यह एक बग हो सकता है।
उत्तर के लिए धन्यवाद। एलडब्लूजी 2132 लिंक वास्तव में ऐसी समस्या के बारे में बात करता है जो समान लेकिन अलग है, इस मुद्दे को ठीक करने के लिए ऐसा ही होता है। मतलब यह समस्या केवल std :: फ़ंक्शन के लिए तय की जाएगी, न कि टेम्पलेट कन्स्ट्रक्टर वाले अन्य प्रकारों के लिए। मुझे लगता है कि वर्दी प्रारंभिकता के लिए मेरा नया नियम "जहां भी आप कर सकते हैं इसका उपयोग करें, सिवाय इसके कि ऑब्जेक्ट में प्रारंभकर्ता_सूची कन्स्ट्रक्टर है। फिर केवल उस निर्माता का उपयोग करें यदि आप उस कन्स्ट्रक्टर को चाहते हैं।"जिसका अर्थ यह भी है कि आप इसे टेम्पलेट कोड में उपयोग नहीं कर सकते हैं। –
मैं नियम पसंद करता हूं" अनियंत्रित कन्स्ट्रक्टर टेम्पलेट्स न लिखें जो किसी भी प्रकार से निहित रूपांतरण की अनुमति देते हैं। "यदि आप इस तरह के प्रकार नहीं बनाते हैं तो आप ' उन लोगों के लिए समस्याएं पैदा नहीं करती हैं जो आपके प्रकार का उपयोग उन वर्गों के साथ करने का प्रयास करते हैं जिनके पास प्रारंभकर्ता-सूची निर्माता हैं। मानक लाइब्रेरी उस नियम का पालन नहीं करती है, लेकिन यह 'std :: function' के लिए तय की जा रही है। –