जैसा कि मुझे पता std::allocator<T>::construct
है कि C ++ के पुराने संस्करण पर केवल दो पैरामीटर हैं; पहला कच्चे, संयुक्त-निर्मित मेमोरी के लिए एक संकेतक है जिसमें हम प्रकार की एक वस्तु का निर्माण करना चाहते हैं T
और दूसरा उस वस्तु को शुरू करने के लिए तत्व प्रकार का एक मूल्य है। तो कॉपी-कंस्ट्रक्टर को आमंत्रित किया जाता है:
struct Foo {
Foo(int, int) { cout << "Foo(int, int)" << endl; }
/*explicit*/ Foo(int) { cout << "Foo(int)" << endl; }
Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; }
};
int main(int argc, char* argv[]) {
allocator<Foo> a;
Foo* const p = a.allocate(200, NULL); // second parameter is required on C++98 but on C++11 it is optional
// Foo* const p = a.allocate(200); // works fine on C++11 but not on C++98
a.construct(p, 5, 7); // works on C++ 11 and up but not C++98
a.construct(p, 10);// works on both
a.destroy(p);
a.destroy(p + 1);
a.deallocate(p, 200);
std::cout << std::endl;
}
क्यों C ++ 98
a.construct(p, 10)
पर कॉपी कंस्ट्रक्टर को कॉल किया जाता है, लेकिन C ++ 11 और इसके बाद के संस्करण को केवल एक कॉन्टेक्टर लेने वाले कंस्ट्रक्टर को कॉल किया जाता है?सी ++ पर कुछ कॉपी-इलिजन अनुकूलन भले ही निर्माता की वजह से 11 इसका मतलब यह है
Foo(int)
हैexplicit
इस तरह के फोन पर काम करता है:a.construct(p, 5)
सी पर काम करता है ++ 11 भी निर्माता हैexplicit
है की यह सी ++ 98 यदि पर काम करता है नहीं पड़ता कि मुझे यकीन हैFoo(int)
हैexplicit
।यदि ऐसा है तो अगर मैं उस कथन को किसी प्रकार के
copy-elision
अनुकूलन अनुकूलन को संकलित करता हूं तो संकलक विफल हो जाएगा? धन्यवाद।