c++ - সি++ 20 এ মনোনীত প্রারম্ভিক




aggregate c++20 (2)

আমি সি ++ 20 বৈশিষ্ট্যগুলির মধ্যে একটি, মনোনীত প্রারম্ভিকদের সম্পর্কে একটি প্রশ্ন পেয়েছি (এই বৈশিষ্ট্য সম্পর্কে আরও তথ্য here )

#include <iostream>

constexpr unsigned DEFAULT_SALARY {10000};

struct Person
{
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed
    std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true is printed

    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // it's ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile, WHY ?

    // For e2 compiler prints a warning "missing initializer for member 'Employee::<anonymous>' [-Wmissing-field-initializers]"
    Employee e2 {.salary{55000}}; 
}

এই কোডটি gcc 9.2.0 এবং -Wall -Wextra -std=gnu++2a পতাকা সহ সংকলিত হয়েছিল।

আপনি উপরে দেখতে পারেন যে, Person এবং Employee উভয় স্ট্রাক্টই সমষ্টি, কিন্তু Employee সমষ্টিটির প্রারম্ভিককরণ মনোনীত ইনিশিয়ালাইজার ব্যবহার করে সম্ভব নয়।

কেউ আমাকে কেন ব্যাখ্যা করতে পারেন?


আপনার বিভিন্ন বেস থেকে একই নামে একাধিক ক্ষেত্র থাকতে পারে,

সুতরাং যুক্তিযুক্তভাবে, আপনার পছন্দসই বেসটির নাম দেওয়া উচিত, তবে মনে হয় এটি করার কোনও উপায় নেই।

// Invalid too:
Employee e1{.Person.name{"John"}, .Person.surname{"Wick"}, .Person.age{40}, .salary{50000}};
Employee e2{.Person{.name{"John"}, .surname{"Wick"}, .age{40}}, .salary{50000}};

এ ছাড়া সি ++ মনোনীত সূচনাটি সি এর চেয়ে বেশি সীমাবদ্ধ:

দ্রষ্টব্য: আউট-অফ-অর্ডার নির্ধারিত সূচনা, নেস্টেড মনোনীত ইনিশিয়ালাইজেশন, মনোনীত ইনিশিয়ালাইজারস এবং নিয়মিত ইনিশিয়েলাইজারের মিশ্রণ এবং অ্যারেগুলির মনোনীত ইনিশিয়ালাইজেশন সমস্তই সি প্রোগ্রামিং ভাষায় সমর্থিত, তবে সি ++ এ অনুমোদিত নয়।


সি ++ ২০ স্ট্যান্ডার্ড অনুযায়ী (9.3.1 সমষ্টিগুলি। পি। # 3)

(৩.১) - যদি প্রাথমিকীকরণ তালিকাটি একটি মনোনীত-ইনিশিয়ালাইজার-তালিকা হয় তবে সমষ্টিটি শ্রেণীর প্রকারের হতে হবে, প্রতিটি নকশাকারীর শনাক্তকারী শ্রেণীর প্রত্যক্ষ অ-স্থিতিশীল ডেটা সদস্য এবং সামগ্রীর সুস্পষ্টভাবে সূচিত উপাদানগুলির নাম রাখবেন সেই উপাদানগুলি হ'ল সেই সদস্যগুলি বা ধারণ করে।

সুতরাং আপনি বেস শ্রেণীর ডেটা সদস্যদের আরম্ভ করার জন্য মনোনীত আরম্ভকারী তালিকাটি ব্যবহার করতে পারবেন না।

পরিবর্তে সাধারণ তালিকা আরম্ভের মতো ব্যবহার করুন

Employee e1{ "John", "Wick", 40, 50000 };

অথবা

Employee e1{ { "John", "Wick", 40 }, 50000 };

বা @ জারোড 42 কোনও মন্তব্যে নির্দেশিত হিসাবে আপনি লিখতে পারেন

Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };

এক্ষেত্রে প্রত্যক্ষ বেস শ্রেণি নির্ধারিত প্রাথমিকের তালিকা দ্বারা আরম্ভ করা হয় যখন পুরো শ্রেণির কর্মচারী একটি অ-মনোনীত আরম্ভকারী তালিকা দ্বারা শুরু করা হয়।





designated-initializer