অপারেটরকে কেন অনেক স্ট্যান্ডার্ড লাইব্রেরির জন্য সি ++ 20 এ সরানো হচ্ছে?


44

সিপ্রেফারেন্স অনুসারে , std::type_info::operator!=সি ++ 20 দিয়ে মুছে ফেলা হবে, তবে std::type_info::operator==আপাতদৃষ্টিতে তা রয়ে গেছে।

পিছনে যুক্তি কি? অসমতার অর্থহীন হওয়ার তুলনায় আমি একমত হতে পারি, তবে সাম্যের তুলনা করা যেমন অর্থহীন তেমনি হবে না, তাই না?

একইভাবে, operator!=যেমন পাত্রে সহ অন্যান্য অনেক মান গ্রন্থাগার ধরনের, এর std::unordered_map::operator!=এবং std::unordered_set::operator!=cppreference অনুযায়ী C ++ 20 সরানো হবে।

লেখার if(!(id1 == id2))সাথে সাথে কোনও if(id1 != id2)বিপরীতে, কেবল বিপরীতে তুলনা করে কোনও কোডকে আরও পরিষ্কার করা যায় না ...

উত্তর:


62

সি ++ ২০ তে স্পেসশিপ <=>অপারেটরের প্রবর্তনের সাথে সম্পর্কিত যেভাবে রিলেশনাল অপারেটররা কাজ করেছিলেন তা পরিবর্তিত হয়েছিল । বিশেষত, যদি আপনি কেবল সরবরাহ করেন operator==তবে a != bতা পুনরায় লিখিত হয় !(a == b)

থেকে [over.match.oper] /3.4 :

পুনরায় লিখিত প্রার্থী সেটটি নিম্নলিখিত হিসাবে নির্ধারিত হয়:

  • রিলেশনাল ([এক্সপ্রেইল]) অপারেটরগুলির জন্য, পুনর্লিখিত প্রার্থীরা এক্স <=> y ​​এক্সপ্রেশনটির জন্য সমস্ত অ-লিখিত প্রার্থীদের অন্তর্ভুক্ত করেছেন।
  • রিলেশনাল ([এক্সপ্রেসেল]) এবং ত্রি-মুখী তুলনা ([এক্সপ্রেস স্পেসশিপ]) অপারেটরগুলির জন্য, পুনর্লিখিত প্রার্থীদের মধ্যে দুটি প্যারামিটারের বিপরীত ক্রমের সাথে সংশ্লেষিত প্রার্থীও অন্তর্ভুক্ত রয়েছে, প্রতিটি নন-রাইটিং প্রার্থীর জন্য এক্সপ্রেশন y <=> এক্স
  • ! = অপারেটরের জন্য ([expr.eq]), পুনর্লিখিত প্রার্থীরা এক্স == y এক্সপ্রেশনটির জন্য সমস্ত অ-লিখিত প্রার্থীদের অন্তর্ভুক্ত করেছেন।
  • সমতা অপারেটরগুলির জন্য, লিখিত প্রার্থীদের মধ্যে দুটি প্যারামিটারের বিপরীত ক্রমের সাথে সংশ্লেষিত প্রার্থী অন্তর্ভুক্ত রয়েছে, প্রতিটি অ-লিখিত প্রার্থীর জন্য y == x এক্সপ্রেশন।
  • অন্যান্য সমস্ত অপারেটরের জন্য, পুনর্লিখিত প্রার্থী সেটটি খালি।

এবং [over.match.oper] / 9 :

যদি কোনও অপারেটর @ এর জন্য পুনর্লিখিত অপারেটর == প্রার্থীকে ওভারলোড রেজোলিউশন দ্বারা নির্বাচিত করা হয়, তবে তার রিটার্নের ধরণটি সিভি বুল হবে এবং এক্স @ ওয়াই এর অর্থ ব্যাখ্যা করা হবে:

  • যদি @ হয়! = এবং নির্বাচিত প্রার্থী প্যারামিটারগুলির বিপরীত ক্রমের সংশ্লেষযুক্ত প্রার্থী হয়! (y == x),
  • অন্যথায়, যদি @ হয়! =,! (x == y) ,
  • অন্যথায় (যখন @ হয় ==), y == এক্স,

প্রতিটি ক্ষেত্রে নির্বাচিত পুনর্লিখিত অপারেটর == প্রার্থী ব্যবহার করে।

এর মতো, এর জন্য একটি স্পষ্ট ওভারলোডের operator!=আর প্রয়োজন হয় না। অপারেটর অপসারণ তুলনা শব্দার্থবিজ্ঞান পরিবর্তন হয়নি।

operator!=যতটা আমি বলতে পারি সমস্ত পাত্রে সেগুলি মুছে ফেলা হয়েছে (যেমন ভেক্টর সাইনোপসিস পরীক্ষা করুন )। কেবলমাত্র ব্যতিক্রমগুলি কনটেইনার অ্যাডাপ্টার std::queueএবং std::stack: আমার ধারণা হ'ল সাম্যতা অপারেটরগুলি প্রতিসাম্পূর্ণ না হলে ক্ষেত্রে তৃতীয় পক্ষের পাত্রে ব্যবহার করার সময় পিছনের সামঞ্জস্যতা সংরক্ষণ করা।


7
p1614 পাশাপাশি আগ্রহী হতে পারে, কারণ আমি বিশ্বাস করি যে প্রস্তাবটি ওভারলোডগুলি সরিয়েছিল।
এন শেড

39

আমাদের operator!=আর সরবরাহিত গ্রন্থাগার দরকার নেই। সরবরাহ করা operator==সংকলকটিকে কিছু জাগল করার অনুমতি দেয় এবং সমস্ত তার নিজস্ব a != bবিবেচনায় atea == b

[Over.match.oper]

3 অ্যানারি অপারেটরের জন্য @ এমন এক ধরণের অপারেন্ড সহ যার সিভি-অযোগ্য সংস্করণ টি 1, এবং বাইনারি অপারেটর @ এর জন্য একটি ধরণের বাম অপারেন্ড সহ যার সিভি-অযোগ্য সংস্করণ টি 1 এবং এমন ধরণের ডান অপরেন্ড যার সিভি- অযোগ্য সংস্করণটি টি 2, প্রার্থী ফাংশনগুলির চার সেট, মনোনীত সদস্য প্রার্থী, অ-সদস্য প্রার্থী, অন্তর্নির্মিত প্রার্থী এবং পুনর্লিখিত প্রার্থীরা নিম্নরূপে নির্মিত:

3.4.3 জন্য! = অপারেটর ([expr.eq]), পুনর্লিখিত প্রার্থীদের অভিব্যক্তি এক্স == Y জন্য সমস্ত অ-পুনর্লিখিত প্রার্থীদের অন্তর্ভুক্ত।

std::type_infoএবং আরো অনেক গ্রন্থাগার ধরনের তাদের ছিল operator!=অংশ হিসেবে মুছে P1614 - দ্য Mothership অবতরণ করেছে

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