সি ++ এ <=> অপারেটরটি কী?


215

আমি যখন সি ++ অপারেটরদের সম্পর্কে জানার চেষ্টা করছিলাম , আমি সিপ্রেফারেন্স ডটকম-এ একটি অদ্ভুত তুলনা অপারেটরকে হোঁচট খেয়েছি , * এমন টেবিলে যা দেখেছিল:

এখানে চিত্র বর্ণনা লিখুন

"আচ্ছা, এগুলি যদি সি ++ এর সাধারণ অপারেটর হয় তবে আমি সেগুলি আরও ভালভাবে শিখি", আমি ভেবেছিলাম তবে এই রহস্যটি ব্যাখ্যা করার জন্য আমার সমস্ত প্রচেষ্টা ব্যর্থ হয়েছিল। এমনকি এখানে, স্ট্যাক ওভারফ্লোতে আমার সন্ধানে আমার ভাগ্য ছিল না।

<=> এবং সি ++ এর মধ্যে কি কোনও সংযোগ রয়েছে ?

এবং যদি থাকে তবে এই অপারেটর ঠিক কী করে?

* ইতিমধ্যে cppreferences.com সেই পৃষ্ঠাটি আপডেট করেছে এবং এতে <=>অপারেটর সম্পর্কিত তথ্য রয়েছে ।


82
@ হ্যাকস: ওহ দয়া করে, আমাদের স্টাফ সম্পর্কে প্রচুর প্রশ্ন ছিল যা এমনকি স্ট্যান্ডার্ডে ভোট হয় নি। আমাদের একটি কারণে সি ++ 20 ট্যাগ রয়েছে। এই ধরণের স্টাফ খুব বেশি অন-টপিকের।
নিকল বোলাস

1
@ কিউবস্প্ল 42 bar< foo::operator<=>এটি কীভাবে <--অপারেটরের মতো হতে পারে তার একটি উদাহরণ ।
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

8
@ হ্যাকস: ঠিক আছে। সি ++ 11 এর মতো সি ++ 11 প্রয়োগকারী সংকলকগুলির সম্পর্কে একটি ট্যাগ। এবং সি ++ 14 হ'ল সি ++ 14 প্রয়োগকারী সংকলকগুলির সম্পর্কে একটি ট্যাগ। এবং সি ++ 17 হ'ল সংকলক যা সি ++ 17 প্রয়োগ করে। না, সি ++ 20 হ'ল সি ++ 20 সম্পর্কে স্টাফের ট্যাগ। এবং যেহেতু এই প্রশ্নটি C ++ 20 সম্পর্কে, এটি রয়েছে। ট্যাগ উইকি যা ভুল ছিল, তা নিজেই ট্যাগ নয়।
নিকল বোলাস

উত্তর:


180

একে ত্রি-মুখী তুলনা চালক বলা হয় ।

মতে P0515 কাগজ প্রস্তাব:

একটি নতুন ত্রি-উপায়ে তুলনা অপারেটর রয়েছে <=>,। অভিব্যক্তি a <=> bএকটি বস্তু যে তুলনা ফেরৎ <0যদি a < b, তুলনা >0যদি a > b, এবং তুলনা ==0যদি aএবং bসমান / সমতুল্য।

আপনার প্রকারের জন্য সমস্ত তুলনা লিখতে, কেবল লিখুন operator<=>যে উপযুক্ত বিভাগের ধরনটি ফিরে আসে:

  • ফিরুন একটি _ordering যদি আপনার টাইপ প্রাকৃতিকভাবে সমর্থন <, এবং আমরা দক্ষতার সঙ্গে তৈরি করে দেব <, >, <=, >=, ==, এবং !=; অন্যথায় একটি _ গুণমান ফিরিয়ে দিন , এবং আমরা দক্ষতার সাথে == এবং ! = তৈরি করব ।

  • আপনার প্রকারের জন্য a == bবোঝা যায় যদি শক্ত f(a) == f(b)পরিবর্তিত হয় (সাবস্টিটিউবিলিটি, যেখানে এফ কেবলমাত্র অ-বেসরকারী কনস্টিট ইন্টারফেস ব্যবহার করে তুলনা-বিশিষ্ট রাজ্য অ্যাক্সেসযোগ্য হয়), অন্যথায় দুর্বল ফিরে আসুন।

Cppreference বলেছেন:

ত্রি-মুখী তুলনা অপারেটর এক্সপ্রেশনগুলির ফর্ম রয়েছে

lhs <=> rhs   (1)  

এক্সপ্রেশন একটি অবজেক্ট রিটার্ন করে

  • তুলনা <0যদিlhs < rhs
  • তুলনা >0যদিlhs > rhs
  • এবং তুলনা ==0যদি lhsএবং rhsসমান / সমতুল্য।

93
"তুলনা <0", "তুলনা >0" এবং "তুলনা ==0" বলতে কী বোঝায় যারা বিভ্রান্ত হয়েছেন (যেমন আমি ছিলাম) তাদের <=>পক্ষে আর্গুমেন্টের উপর ভিত্তি করে প্রত্যাবর্তনগুলি নেতিবাচক, ধনাত্মক বা শূন্য মানের মানে। অনেকটা লাইক strncmpএবং memcmp
কর্নস্টাল্ক

1
@ ডাই যদিও উভয়ই 'a' < 'a'এবং 'c' < 'a'উভয়ই মিথ্যা, 'a' < 'a'এবং 'a' < 'c'তা নয়। : শক্তিশালী ক্রম নিম্নলিখিত সত্য a != ba < b || b < a
Revolver_Ocelot

1
@ রিভলবার_ ওসেলোট আহ, যাতে এটি সংজ্ঞায়িত করা যায় operator==(T x, T y) { return !(x < y) && !(y < x); }এবং হিসাবে তৈরি করা যায় operator!=(T x, T y) { return (x < y) || (y < x); }- আহ-হা! অবশ্যই ==এটি একটি সত্যের চেয়ে কম দক্ষ কারণ এটি তুলনাকে দু'বার ডেকে আনি, তবে এখনও ঝরঝরে।
দাই

3
"শক্তিশালী ফিরে আসা" এবং "দুর্বল ফিরে আসা" এর অর্থ কী?
লুসিডব্রোট

2
@ hkBattousai এর অর্থ হল বস্তুটি ফিরে আসে, যখন তুলনা < 0করে সত্য হয়। এটি যদি হয় a < bতবে (a <=> b) < 0সর্বদা সত্য।
rmobis

116

উপর 2017-11-11 , আইএসও সি ++ কমিটির গৃহীত ঔষধি Sutter 's প্রস্তাব <=> "মহাকাশযান" তিনপথ তুলনা অপারেটর যে যোগ করা হয় নি নতুন বৈশিষ্ট্য এক হিসাবে সি ++ 20ধারাবাহিক তুলনা সুটার শিরোনামের কাগজে , মোরার এবং ব্রাউন নতুন ডিজাইনের ধারণাগুলি প্রদর্শন করে। প্রস্তাবনাটির ওভারভিউয়ের জন্য নিবন্ধের একটি অংশ এখানে দেওয়া হয়েছে:

অভিব্যক্তি একটি <=> খ আয় একটি বস্তু যে তুলনা <0 যদি একটি <b , তুলনা > 0 যদি একটি> খ , এবং তুলনা == 0 যদি a ও b সমান / সমতুল্য।

সাধারণ ক্ষেত্রে: আপনার টাইপ এক্স এর জন্য সমস্ত ধরণের ওয়াইয়ের সাথে সদস্যতার সাথে শব্দার্থক শব্দগুলির সাথে সমস্ত তুলনা লিখতে কেবল লিখুন:

auto X::operator<=>(const Y&) =default;

উন্নত ক্ষেত্রে: আপনার টাইপ এক্স এর জন্য সমস্ত ধরণের ওয়াইয়ের সাথে সমস্ত তুলনা লিখতে , কেবল অপারেটর লিখুন <=> যা একটি ওয়াই লাগে , পছন্দসই হলে সদস্যপদার্থ শব্দার্থার্থ পেতে = ডিফল্ট ব্যবহার করতে পারেন এবং উপযুক্ত বিভাগের প্রকারটি ফেরত পাবেন:

  • যদি আপনার ধরণটি প্রাকৃতিকভাবে <টি সমর্থন করে তবে একটি _র্ডারিং ফিরিয়ে দিন , এবং আমরা দক্ষতার সাথে প্রতিসাম্য তৈরি করব < , > , <= , > = , == , এবং ! = ; অন্যথায় একটি আসতে _equality , এবং আমরা দক্ষতার সঙ্গে প্রতিসম তৈরি করে দেব == এবং ! =
  • রিটার্ন strong_ যদি আপনার টাইপ জন্য একটি == খ বোঝা চ (ক) == চ (খ) (substitutability, যেখানে শুধুমাত্র তুলনা-লক্ষণীয় রাষ্ট্র পাবলিক ব্যবহার প্রবেশযোগ্য সার্চ const সদস্য), অন্যথায় আসতে weak_

তুলনা বিভাগ

পাঁচটি তুলনামূলক বিভাগগুলি std::প্রকার হিসাবে সংজ্ঞায়িত করা হয় , যার প্রত্যেকটিতে নিম্নলিখিত বর্ণিত মান থাকে:

+--------------------------------------------------------------------+
|                  |          Numeric  values          | Non-numeric |
|     Category     +-----------------------------------+             |
|                  | -1   | 0          | +1            |   values    |
+------------------+------+------------+---------------+-------------+
| strong_ordering  | less | equal      | greater       |             |
| weak_ordering    | less | equivalent | greater       |             |
| partial_ordering | less | equivalent | greater       | unordered   |
| strong_equality  |      | equal      | nonequal      |             |
| weak_equality    |      | equivalent | nonequivalent |             |
+------------------+------+------------+---------------+-------------+

এই ধরণের মধ্যে অন্তর্ভুক্ত রূপান্তরগুলি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

  • strong_orderingমান { less, equal, greater} পরোক্ষভাবে ধর্মান্তরিত:
    • weak_orderingমান { less, equivalent, greater}
    • partial_orderingমান { less, equivalent, greater}
    • strong_equalityমান { unequal, equal, unequal}
    • weak_equalityমান { nonequivalent, equivalent, nonequivalent}
  • weak_orderingমান { less, equivalent, greater} পরোক্ষভাবে ধর্মান্তরিত:
    • partial_orderingমান { less, equivalent, greater}
    • weak_equalityমান { nonequivalent, equivalent, nonequivalent}
  • partial_orderingমান { less, equivalent, greater, unordered} পরোক্ষভাবে ধর্মান্তরিত:
    • weak_equalityমান { nonequivalent, equivalent, nonequivalent, nonequivalent}
  • strong_equalityমানগুলির সাথে { equal, unequal} সুস্পষ্টভাবে রূপান্তরিত করে:
    • weak_equalityমান সহ equivalent, nonequivalent}

ত্রি-উপায়ে তুলনা

<=>টোকেন আবির্ভাব ঘটে। পুরানো উত্স কোডে অক্ষরের ক্রমটি <=>টোকেনাইজ করে <= >। উদাহরণস্বরূপ, X<&Y::operator<=>এর অর্থ ধরে রাখতে একটি স্থান যুক্ত করা দরকার।

ওভারলোডযোগ্য অপারেটর <=>একটি ত্রি-উপায়ে তুলনা ফাংশন এবং এর চেয়ে বেশি <এবং কমের প্রাধান্য রয়েছে <<। এটি এমন প্রকারের প্রত্যাবর্তন করে যা আক্ষরিকের সাথে তুলনা করা যেতে পারে 0তবে অন্যান্য রিটার্নের ধরণগুলি যেমন এক্সপ্রেশন টেম্পলেটগুলিকে সমর্থন করার জন্য অনুমোদিত। সমস্ত <=>অপারেটর ভাষা এবং স্ট্যান্ডার্ড লাইব্রেরিতে সংজ্ঞায়িত 5 বর্ণিত std::তুলনা বিভাগের ধরণের মধ্যে একটি ফেরত দেয় ।

ভাষার ধরণের জন্য, নিম্নলিখিত অন্তর্নির্মিত <=>একই ধরণের তুলনা সরবরাহ করা হয়। অন্যথায় উল্লিখিত ব্যতীত সমস্ত কনসটেক্সপ্রস । এই তুলনাগুলি স্কেলার প্রচার / রূপান্তরগুলি ব্যবহার করে ভিন্নজাতীয়ভাবে আহ্বান করা যায় না।

  • জন্য bool, অবিচ্ছেদ্য এবং পয়েন্টার ধরণের, <=>প্রত্যাবর্তন strong_ordering
  • পয়েন্টার ধরণের জন্য, বিভিন্ন সিভি-যোগ্যতা এবং উত্স-থেকে-বেস রূপান্তরগুলিকে একটি সজ্জা অন্তর্নির্মিত প্রার্থনা করার অনুমতি দেওয়া হয় <=>, এবং সেখানে অন্তর্নির্মিত ভিন্ন ভিন্ন হয় operator<=>(T*, nullptr_t)। একই বস্তু / বরাদ্দের সাথে পয়েন্টারের তুলনা কেবল ধ্রুবক প্রকাশ।
  • মৌলিক ভাসমান পয়েন্টের ধরণের জন্য, <=>রিটার্ন পেতে partial_orderingএবং বৃহত্তর ভাসমান পয়েন্টের ধরণের যুক্তিগুলি প্রশস্ত করে বিজাতীয়ভাবে আহ্বান করা যেতে পারে।
  • গণনার জন্য, <=>গণনার অন্তর্নিহিত প্রকারের মতোই ফেরত দেয় <=>
  • জন্য nullptr_t, <=>রিটার্ন strong_orderingএবং সর্বদা ফলন equal
  • অনুলিপিযোগ্য অ্যারেগুলির জন্য, T[N] <=> T[N]একই ধরণের T'গুলি হিসাবে ফেরত দেয় <=>এবং লিক্সোগ্রাফিকাল এলিমেন্টের তুলনা করে। <=>অন্যান্য অ্যারে জন্য নেই ।
  • কারণ voidনেই <=>

এই অপারেটরের অভ্যন্তরীণ কাজগুলি আরও ভালভাবে বুঝতে, দয়া করে মূল কাগজটি পড়ুন । অনুসন্ধান ইঞ্জিনগুলি ব্যবহার করে আমি এটি সন্ধান করেছি।


1
যেন সিপিপি ইতিমধ্যে যথেষ্ট জটিল ছিল না। কেন নয় কেবল একটি তুলনা পদ্ধতি লিখুন ...
লিয়ান্দ্রো

6
মহাকাশযান অপারেটর @Leandro হয় যে তুলনা পদ্ধতি। অতিরিক্তভাবে, এটি কেবল ছয়টি তুলনা অপারেটরকে কাজ করে এবং লিখে (বা মুছে ফেলে)। আমি ছয়টি পৃথক বয়লারপ্লেটের উপরে লেখা একটি তুলনা অপারেটরের ফাংশন নেব।
বেনামী

প্রকারটি _equalityমারা গেছে তা নোট করুন : এটি প্রমাণিত হয়েছে যে <=>চারটি রিলেশনাল অপারেটরগুলির সাথে ভাল খেলেন তবে দুটি সমতা অপারেটরগুলির সাথেও নয় (যদিও আপনি সমস্তটি চান সেখানে সাধারণ ক্ষেত্রে সমর্থন করার জন্য কিছু তীব্র সিনট্যাকটিক চিনি রয়েছে)।
ডেভিস হেরিং

12

রেফারেন্সড ওয়েব পৃষ্ঠা পরিবর্তিত হওয়ার পরে এই উত্তরটি অপ্রাসঙ্গিক হয়ে উঠেছে

আপনি যে ওয়েব পৃষ্ঠাটি উল্লেখ করছেন সেটি ভেঙে গেছে। সেদিন এটি অনেকগুলি সম্পাদনা করা হচ্ছিল এবং বিভিন্ন অংশ সিঙ্কে ছিল না। আমি যখন স্ট্যাটাসটি দেখছিলাম তখন তা ছিল:

পৃষ্ঠার শীর্ষে এটি বর্তমানে বিদ্যমান তুলনা অপারেটরগুলি তালিকাভুক্ত করে (সি ++ 14 এ)। সেখানে নেই <=>

পৃষ্ঠার নীচে, তাদের একই অপারেটর তালিকাভুক্ত করা উচিত ছিল, তবে তারা বোকা বানিয়ে ভবিষ্যতের এই পরামর্শটি যুক্ত করেছিল।

gcc<=>এখনও (এবং সাথে -std=c++14, কখনই হবে না) সম্পর্কে জানে না , সুতরাং এটি মনে করে যে আপনি বোঝাতে চেয়েছিলেন a <= > b। এটি ত্রুটির বার্তাটি ব্যাখ্যা করে।

যদি আপনি এখন থেকে পাঁচ বছর পরে একই জিনিসটি চেষ্টা করেন তবে আপনি সম্ভবত একটি ভাল ত্রুটি বার্তা পাবেন, এর মতো কিছু something <=> not part of C++14.


1
ওয়েব পৃষ্ঠার ওপিতে লিঙ্কগুলি সঠিক, আপনার লিঙ্ক করা পৃথক পৃষ্ঠাটিও। এটি <=>অপারেটরটিকে (C ++ 20) লেবেলটির সাথে যোগ্যতা দেয় , এটি থেকে কোন স্ট্যান্ডার্ডের এটি আশা করা উচিত তা আপনাকে জানায় telling স্ট্যান্ডার্ডস লেবেলিং এমন একটি কনভেনশন যা cppreferences.com অনুসরণ করে। অবশ্যই আপনার কাছে এটির সমর্থন করার জন্য কোনও টাইম মেশিনে ফিরে আসা একটি সংকলক আপনার কাছে নেই, তবে সিপ্পিফারেন্স আপনাকে (সঠিকভাবে) কী আশা করবে তা বলে দেয়।
স্পেন্সার

হ্যাঁ, কিন্তু ... উত্তর নয়। আপনি মন্তব্য করছেন ... বা কিছু।
qlp

2
আমি প্রশ্নের অনুরূপ একই ওয়েব পৃষ্ঠায় লিঙ্ক করতে চেয়েছিলাম, কিন্তু মিস করেছি। আমার মনে হয় আমি প্রশ্নের উত্তরগুলি উত্তর দিয়েছি অন্য উত্তরগুলি দেয় নি। আমি ইতিমধ্যে মূল সাহসী প্রশ্নটিকে অগ্রাহ্য করেছি যেহেতু অন্যান্যরা এরই মধ্যে এর উত্তর দিয়ে গেছে।
স্টিগ হেমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.