c++ - ইক্যুয়ালিটি অপারেটর সি++ 20 তে একটি কাস্টম স্পেসশিপ অপারেটর বাস্তবায়নের জন্য সংজ্ঞায়িত হয় না




c++20 spaceship-operator (2)

আমি নতুন স্পেসশিপ অপারেটরের সাথে এক অদ্ভুত আচরণে চলে যাচ্ছি <=> সি ++ 20 এ। আমি ভিজুয়াল স্টুডিও 2019 সংকলকটি /std:c++latest ব্যবহার করছি।

এই কোডটি প্রত্যাশিত হিসাবে জরিমানা সংকলন করেছে:

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};

int main()
{
    X a, b;

    a == b; // OK!

    return 0;
}

তবে, আমি যদি এইটিতে এক্স পরিবর্তন করি:

struct X
{
    int Dummy = 0;
    auto operator<=>(const X& other) const
    {
        return Dummy <=> other.Dummy;
    }
};

আমি নিম্নলিখিত সংকলক ত্রুটি পেয়েছি:

error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator

আমি ঝাঁকুনির উপরও এটি চেষ্টা করেছি এবং আমিও একইরকম আচরণ পেয়েছি।

আমি ডিফল্ট বাস্তবায়ন কেন operator== সঠিকভাবে উত্পন্ন করে তার কিছু ব্যাখ্যা প্রশংসা করব, কিন্তু কাস্টমটি এটি করে না।


অন্যান্য উত্তরগুলি ভাষাটি কেন এমন হয় তা সত্যিই ভালভাবে ব্যাখ্যা করে। আমি কেবল এটি যুক্ত করতে চেয়েছিলাম যদি এটি সুস্পষ্ট না হয় তবে অবশ্যই কোনও ডিফল্ট operator== operator<=> ব্যবহারকারীর দ্বারা সরবরাহিত operator<=> থাকা সম্ভব operator== আপনাকে কেবল স্পষ্টভাবে ডিফল্ট operator== লিখতে হবে operator== :

struct X
{
    int Dummy = 0;
    auto operator<=>(const X& other) const
    {
        return Dummy <=> other.Dummy;
    }
    bool operator==(const X& other) const = default;
};

এই বৈশিষ্ট্যের মানককরণের সময়, সিদ্ধান্ত নেওয়া হয়েছিল যে সাম্যতা এবং আদেশকে যৌক্তিকভাবে পৃথক করা উচিত। সেই হিসাবে, সমতা পরীক্ষার ব্যবহারগুলি ( == এবং != ) কখনই operator<=> ডাকে না । তবে এটি উভয়কেই একক ঘোষণার মাধ্যমে ডিফল্ট করতে সক্ষম হিসাবে দরকারী হিসাবে দেখা হয়েছিল। সুতরাং আপনি যদি operator<=> ডিফল্ট হন তবে সিদ্ধান্ত নেওয়া হয়েছিল যে আপনি ডিফল্ট operator== বোঝাতে চেয়েছিলেন operator== (যদি আপনি এটি পরে সংজ্ঞায়িত না করেন বা এর আগে সংজ্ঞা না দিয়ে থাকেন)।

কেন এই সিদ্ধান্ত নেওয়া হয়েছিল তা সম্পর্কে , মূল যুক্তিটি এরকম হয়। std::string বিবেচনা করুন। দুটি স্ট্রিংয়ের ক্রম শব্দের শব্দকোষ; প্রতিটি অক্ষরের অন্যান্য স্ট্রিংয়ের প্রতিটি চরিত্রের তুলনায় এর পূর্ণসংখ্যা মান থাকে। অর্ডার দেওয়ার ফলে প্রথম অসমতার ফলাফল।

তবে স্ট্রিংয়ের সমতা পরীক্ষার একটি শর্ট সার্কিট রয়েছে। দুটি স্ট্রিং যদি সমান দৈর্ঘ্যের না হয়, তবে চরিত্র-ভিত্তিক তুলনা মোটেও লাভ করার উপায় নেই; তারা সমান নয়। সুতরাং যদি কেউ সাম্য পরীক্ষা করে থাকে, আপনি যদি এটির শর্ট সার্কিট করতে পারেন তবে আপনি এটি দীর্ঘ-রূপে করতে চান না।

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





spaceship-operator