পুরানো বরাদ্দকারী :: কনস্ট্রাক্ট এবং নতুন এবং সুস্পষ্ট কনস্ট্রাক্টরের পার্থক্য কী?


15

আমি জানি যেহেতু std::allocator<T>::constructসি ++ এর পুরানো সংস্করণে মাত্র দুটি পরামিতি লাগে; প্রথমটি হ'ল কাঁচা, অ-নির্মাণকৃত মেমরির পয়েন্টার যা আমরা প্রকারের একটি অবজেক্ট তৈরি করতে চাই 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;
}
  • কেন সি ++ 98 a.construct(p, 10)অনুলিপি অনুলিপি কনস্ট্রাক্টর কিন্তু সি ++ 11 এবং উপরের দিকে কেবল ঠিক সেই কনস্ট্রাক্টরকে কল করছে যা একটি পূর্ণসংখ্যা লাগে?

  • সি ++ উপর কিছু অনুলিপি বিলোপ অপ্টিমাইজেশান এমনকি যদি কন্সট্রাকটর কারণে 11 এর অর্থ কি এই Foo(int)নয় explicitএমন কলে কাজ: a.construct(p, 5)সি উপর কাজ করে ++, 11 এমনকি কন্সট্রাকটর হয় explicitহয় এটা সি ++ 98 যদি কাজ করে কী আমি নিশ্চিত Foo(int)হয় explicit

  • যদি তা হয় তবে আমি যদি সেই বিবৃতিটি একরকম অক্ষম copy-elisionঅপটিমাইজেশন দিয়ে সংকলন করি তবে সংকলকটি ব্যর্থ হয়? ধন্যবাদ.


3
সংক্ষিপ্ত উত্তর: সি ++ 11 অবধি কোনও নিখুঁত বারণ ছিল না । নীচে @flyx সরবরাহ করেছেন। মনে রাখবেন যে কোনও অনুলিপি জড়িত নেই (কোনও পাস-বাই-মান বা রিটার্ন-বাই-মান নেই)।
ড্যানিয়েল ল্যাঙ্গার

উত্তর:


13

এটি হ'ল construct সি ++ 11 এ ঘোষণাপত্র পরিবর্তিত হয়েছে :

void construct( pointer p, const_reference val );  (1)  (until C++11)
template< class U, class... Args >
void construct( U* p, Args&&... args );            (2)  (since C++11)

প্রথম ঘোষণাটি অনুলিপি কনস্ট্রাক্টরকে ডাকে, দ্বিতীয় বিবৃতিতে কোনও কনস্ট্রাক্টরকে কল করা হয় যা প্রদত্ত যুক্তিগুলির তালিকার সাথে মেলে। এটি অনুলিপি নির্মাণকারী হতে পারে তবে আপনি নিজের কোডটিতে যেমন দেখেছেন তেমনই অন্য একজন নির্মাতাও।

a.construct(p, 10)অনুলিপিটি কনস্ট্রাক্টরের মাধ্যমে 10রূপান্তরিত হওয়ায় অনুলিপিটি কনট্রাক্টরকে সি ++ 98 এ কল করে । এই রূপান্তরটি সি ++ 11 এ প্রয়োজনীয় নয় যেহেতু এখানে একটি ম্যাচিং কনস্ট্রাক্টর রয়েছে যা গ্রহণ করে (ঠিক সেই কনস্ট্রাক্টর যা সি ++ 98 তে রূপান্তর করার জন্য ব্যবহৃত হয়েছিল)। এই কারণে কোড যখন আপনি যোগ C ++ 98 কাজ করে না - এটা রূপান্তর করতে পারবেন না একটি থেকে তারপর।FooFoo(int)intexplicit10Foo

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.