ডিফল্ট / অনুলিপি / মুভ ctor এবং অনুলিপি / সরানো অ্যাসাইনমেন্ট অপারেটরের স্বয়ংক্রিয় প্রজন্মের শর্তসমূহ?


127

আমি আমার স্মৃতিটি রিফ্রেশ করতে চাই যার অধীনে একটি সংকলক সাধারণত ডিফল্ট কনস্ট্রাক্টর, কপি কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর তৈরি করে auto

আমি স্মরণ করি কিছু নিয়ম ছিল, তবে আমি মনে করি না এবং অনলাইনে একটি নামী সংস্থানও খুঁজে পাই না। কেউ সাহায্য করতে পারেন?

উত্তর:


136

নিম্নলিখিতটিতে, "স্বয়ংক্রিয়ভাবে উত্পন্ন" এর অর্থ "স্পষ্টভাবে ডিফল্ট হিসাবে ঘোষিত, তবে মুছে ফেলা হিসাবে সংজ্ঞায়িত করা হয়নি"। এমন পরিস্থিতি রয়েছে যেখানে বিশেষ সদস্য ফাংশনগুলি ঘোষণা করা হয় তবে মুছে ফেলা হিসাবে সংজ্ঞায়িত করা হয়।

  • কোনও ব্যবহারকারী-ঘোষিত কনস্ট্রাক্টর (§12.1 / 5) না থাকলে ডিফল্ট কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে উত্পন্ন হয়।
  • কোনও ব্যবহারকারী-ঘোষিত মুভ কনস্ট্রাক্টর বা মুভ অ্যাসাইনমেন্ট অপারেটর না থাকলে অনুলিপিটি কনট্রাক্টর স্বয়ংক্রিয়ভাবে উত্পন্ন হয় (কারণ C ++ 03 তে কোনও মুভ কনস্ট্রাক্টর বা মুভ অ্যাসাইনমেন্ট অপারেটর নেই, এটি সি ++ 03 তে "সর্বদা" এ সরলীকৃত হয়) ( §12.8 / 8)।
  • কোনও ব্যবহারকারী-ঘোষিত মুভ কনস্ট্রাক্টর বা মুভ অ্যাসাইনমেন্ট অপারেটর (.812.8 / 19) না থাকলে অনুলিপি অ্যাসাইনমেন্ট অপারেটরটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয়।
  • কোনও ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর (§12.4 / 4) না থাকলে ডিস্ট্রাক্টর স্বয়ংক্রিয়ভাবে উত্পন্ন হয়।

সি ++ 11 এবং কেবলমাত্র পরে:

  • কোনও ব্যবহারকারী-ঘোষিত অনুলিপি নির্মাণকারী, অনুলিপি নিয়োগকারী অপারেটর বা ডেস্ট্রাক্টর না থাকলে এবং উত্পন্ন মুভ কনস্ট্রাক্টরটি বৈধ (.812.8 / 10) থাকলে মুভ কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে উত্পন্ন হয়।
  • মুভ অ্যাসাইনমেন্ট অপারেটরটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয় যদি কোনও ব্যবহারকারী-ঘোষিত অনুলিপি নির্মাণকারী, অনুলিপি নিয়োগকারী অপারেটর বা ডেস্ট্রাক্টর না থাকে এবং যদি উত্পন্ন মুভ অ্যাসাইনমেন্ট অপারেটরটি বৈধ হয় (যেমন, যদি এটি ধ্রুবক সদস্য নিয়োগের প্রয়োজন না হয়) (.812.8 / 21)।

9
উত্তরাধিকারসূত্রে ধ্বংসকারী গণনা করে? মানে, বলুন যে আমি একটি খালি ভার্চুয়াল ডেস্ট্রাক্টর সহ একটি বেস ক্লাস পেয়েছি। এটি কি সাবক্লাসে মুভ কনস্ট্রাক্টরগুলির সৃষ্টি প্রতিরোধ করে? উত্তরটি যদি হ্যাঁ হয়, তবে আমি বেস ক্লাসে একটি মুভ কনস্ট্রাক্টর সংজ্ঞায়িত করলে তা কী সহায়তা করবে?
কামিল্ক

10
আমি মনে করি যে আপনার সম্ভবত উল্লেখ করা উচিত যে constক্লাসে সদস্য থাকার কারণে
নির্মাতাকে

"কি এমন পরিস্থিতি রয়েছে যেখানে বিশেষ সদস্য ফাংশনগুলি ঘোষণা করা হয় তবে মুছে ফেলা হিসাবে সংজ্ঞায়িত করা হয়" " আপনার যেখানে উদাহরণস্বরূপ কনস্ট বা রেফারেন্স সদস্য রয়েছে সেখানে উল্লেখ করুন যেখানে স্থানান্তর অসম্ভব হবে? না, এটি হতে পারে না, কারণ সেখানে অনুলিপি প্রয়োগ করা হবে।
তোয়াই

আমি জানি যে এটি এই ফোরামে হাইপারলিঙ্কগুলি প্রেরণে সীমাবদ্ধ। তবে এটিও ভাল নিবন্ধ - cplusplus.com/articles/y8hv0pDG
bruziuz

দ্রষ্টব্য, মান অনুসারে একটি স্পষ্টভাবে ডিফল্ট কপির কনস্ট্রাক্টর " শ্রেণিকে যদি ব্যবহারকারী দ্বারা ঘোষিত অনুলিপি অ্যাসাইনমেন্ট অপারেটর বা একটি ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর থাকে " ( 12.8 শ্রেণি অবজেক্টগুলি [শ্রেণি.কপি] ) অনুলিপি করা হয় তবে তা অবজ্ঞা করা হয়
সিগি

98

আমি নীচের চিত্রটি খুব দরকারী খুঁজে পেয়েছি।

স্বয়ংক্রিয় কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটরগুলির জন্য সি ++ বিধিস্টিকি বিটস থেকে - জিরো হিরোর নিয়ম হয়ে উঠছে


সুন্দর। "স্বতন্ত্র" কী বোঝায়? কি থেকে স্বাধীন?
তোয়াই

8
অনুলিপি কর্ডার / অ্যাসাইনমেন্ট একে অপরের থেকে 'স্বতন্ত্র'। আপনি যদি কেবল একটি লিখেন, সংকলকটি অন্যটি সরবরাহ করবে। বিপরীতে, আপনি যদি একটি সরানো ctor বা একটি সরানো অ্যাসাইনমেন্ট সরবরাহ করেন তবে সংকলক অন্যটি সরবরাহ করবে না।
মার্কো এম

ভাবছেন অনুলিপি কার্যক্রমের পিছনে কী কারণগুলি স্বাধীন। Reasonsতিহাসিক কারণ হতে পারে? বা এই সত্য যে অনুলিপি এটির লক্ষ্যমাত্রাকে সংশোধন করবে না তবে চালনা করবে?
রাগা__ এম

@ এক্সপ্লোরার_ এন হ্যাঁ, পিছনে সামঞ্জস্য, তাই soতিহাসিক কারণ। এটি অনেক দিন আগে একটি খারাপ ডিজাইনের পছন্দ ছিল, তাই বাগগুলি খুঁজে বের করতে কঠোরতা এড়াতে এখন "তিনটি নিয়ম" (সমস্ত 3 বা কোনওটিই সংজ্ঞায়িত করুন: অনুলিপি নির্ধারণকারী, অনুলিপি অ্যাসাইনমেন্ট অপারেটর এবং প্রায়শই ধ্বংসকারী) এর মতো ভাল অভ্যাসগুলির প্রয়োজন।
আতবলাস

@MarcoM।, যতটা আমি বুঝতে করেছি, "আপনি লেখেন, তাহলে ..." অবস্থা বিশেষ সদস্য ফাংশন সেট করার দুটি মামলা রয়েছে = delete(সুস্পষ্ট) অথবা = default(কম আমাকে সুস্পষ্ট)। আমি কি সঠিক?
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

2

সি ++ 17 এন 4659 মানক খসড়া

দ্রুত ক্রস স্ট্যান্ডার্ড রেফারেন্সের জন্য, নিম্নলিখিত সিপ্রেফারেন্স এন্ট্রিগুলির "স্পষ্টভাবে ঘোষিত" বিভাগগুলি দেখুন:

একই তথ্য অবশ্যই স্ট্যান্ডার্ড থেকে প্রাপ্ত করা যেতে পারে। সি ++ 17 এন 4659 স্ট্যান্ডার্ড খসড়াতে যেমন :

15.8.1 "অনুলিপি / মুভ কনস্ট্রাক্টর" অনুলিপি নির্মাণকারীর পক্ষে বলেছেন:

6 যদি শ্রেণি সংজ্ঞাটি স্পষ্টরূপে একটি অনুলিপি নির্মাণকারীকে ঘোষণা না করে তবে একটি স্পষ্ট নয় এমন একটি স্পষ্টভাবে ঘোষণা করা হয়। যদি শ্রেণি সংজ্ঞাটি একটি মুভ কনস্ট্রাক্টর বা মুভ অ্যাসাইনমেন্ট অপারেটর হিসাবে ঘোষণা করে, তবে স্পষ্টভাবে ঘোষিত অনুলিপি নির্মাণকারীকে মুছে ফেলা হিসাবে সংজ্ঞায়িত করা হয়; অন্যথায়, এটি ডিফল্ট হিসাবে চিহ্নিত করা হয়েছে (১১.৪)। পরবর্তী ক্লাসটির ব্যবহারকারী-ঘোষিত অনুলিপি অ্যাসাইনমেন্ট অপারেটর বা ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর থাকলে অবহেলা করা হয়।

এবং সরানো কনস্ট্রাক্টরের জন্য:

৮ যদি দশম শ্রেণির সংজ্ঞা স্পষ্টভাবে কোনও মুভ কনস্ট্রাক্টরকে ঘোষণা করে না, তবে একটি স্পষ্টতই স্পষ্টভাবে ডিফল্ট হিসাবে ঘোষণা করা হবে যদি এবং কেবল যদি

  • (8.1) - এক্স এর কোনও ব্যবহারকারী-ঘোষিত অনুলিপি নির্মাণকারী নেই,

  • (8.2) - এক্স এর কোনও ব্যবহারকারী-ঘোষিত অনুলিপি অপারেটর নেই,

  • (8.3) - এক্স এর কোনও ব্যবহারকারী-ঘোষিত মুভ অ্যাসাইনমেন্ট অপারেটর নেই এবং and

  • (8.4) - এক্স এর কোনও ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর নেই।

15.8.2 "অনুলিপি / মুভ অ্যাসাইনমেন্ট অপারেটর" অনুলিপি নিয়োগের জন্য বলেছে:

2 যদি শ্রেণি সংজ্ঞাটি স্পষ্টভাবে একটি অনুলিপি অপারেটর অপারেটর ঘোষণা করে না, তবে একটি স্পষ্টভাবে ঘোষণা করা হয়। যদি শ্রেণি সংজ্ঞাটি একটি মুভ কনস্ট্রাক্টর বা মুভ অ্যাসাইনমেন্ট অপারেটর ঘোষণা করে, তবে স্পষ্টভাবে ঘোষিত অনুলিপি অপারেটরটিকে মুছে ফেলা হিসাবে সংজ্ঞায়িত করা হয়; অন্যথায়, এটি ডিফল্ট হিসাবে চিহ্নিত করা হয়েছে (১১.৪)। পরবর্তী ক্লাসটির ব্যবহারকারী-ঘোষিত অনুলিপি নির্মাণকারী বা ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর থাকলে অবহেলা করা হয়।

এবং সরানোর কার্যভারের জন্য:

৪ যদি দশম শ্রেণির সংজ্ঞা স্পষ্টভাবে একটি মুভ অ্যাসাইনমেন্ট অপারেটর ঘোষণা করে না, তবে একজনকে স্পষ্টভাবে ডিফল্ট হিসাবে ঘোষণা করা হবে যদি এবং কেবল যদি

  • (৪.১) - এক্স-এর কোনও ব্যবহারকারী-ঘোষিত অনুলিপি নির্মাণকারী নেই,
  • (৪.২) - এক্স-এর কোনও ব্যবহারকারী-ঘোষিত মুভ কনস্ট্রাক্টর নেই,
  • (৪.৩) - এক্স-এর কোনও ব্যবহারকারী-ঘোষিত অনুলিপি অপারেটর নেই এবং
  • (৪.৪) - এক্স-এর কোনও ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর নেই।

15.4 "ধ্বংসকারীরা" এটি ধ্বংসকারীদের জন্য বলে:

4 যদি কোনও শ্রেণীর কোনও ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টর না থাকে তবে একজন ডেস্ট্রাক্টরকে স্পষ্টতই খেলাপি হিসাবে ঘোষণা করা হয় (১১.৪)। একটি সুস্পষ্টভাবে ঘোষিত ধ্বংসকারী তার শ্রেণীর একটি ইনলাইন পাবলিক সদস্য।

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