जैसा कि मुझे पता 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अनुकूलन अनुकूलन को संकलित करता हूं तो संकलक विफल हो जाएगा? धन्यवाद।