কোনও ফাংশন প্যারামিটারের জন্য একটি টেম্পলেট আর্গুমেন্ট স্থানধারক হিসাবে 'অটো'


22

সি ++ 20 autoফাংশন প্যারামিটার ধরণের জন্য ব্যবহারের অনুমতি দেয় ।

এটি কি autoকোনও টেম্পলেট আর্গুমেন্ট স্থানধারক হিসাবে ব্যবহারের অনুমতি দেয় (অনুরূপ নয়, তবে সি ++ 17 টেমপ্লেটের আত্মায় <অটো> ফাংশন প্যারামিটার ধরণের জন্য ) ব্যবহার করার অনুমতি দেয়?

সুতরাং নিম্নলিখিত কোড, প্রাক সি ++ 20:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
    std::cout << p.first << ", " << p.second;
}

হিসাবে লেখা যেতে পারে:

void printPair(const std::pair<auto, auto>& p) {
    std::cout << p.first << ", " << p.second;
}

এটি সংকলন করে এবং দুর্দান্তভাবে কাজ করে ধারণাগুলির জন্য পরীক্ষামূলক জিসিসি বাস্তবায়নের সাথে করে।

এটি কি সি ++ 20 এর সাথে বৈধ বাক্য গঠন?


আমি যা শুনেছি তা থেকে নিয়ন্ত্রিত auto সরাসরি টেম্পলেটাইজড ভাষায় অনুবাদ করে typename XYZ, যা দৃ .়তার সাথে বোঝায় যে এটি বৈধ বাক্য গঠন ax ঝরঝরে ।
— ফিউরিশ

2
নোট যে ঝনঝন একমত নন এবং ঝনঝন এবং জিসিসি কিনা একই মতানৈক্য আছে autoমধ্যে অনুমোদিত হয় [](const std::pair<auto, auto>& p){}(সঙ্গে কিনা -std=c++2aবা -std=c++17)।
— আখরোট


ধন্যবাদ আপনাকে ডেভিস হেরিং - আমি শব্দটি ঠিক করেছি
— আমির

উত্তর:


17

এই বাক্য গঠনটি সি ++ ধারণাগুলির প্রযুক্তিগত নির্দিষ্টকরণে বৈধ, তবে সি ++ 20 এ নয় in সি ++ ২০ টি ধারণায়, autoকেবলমাত্র একটি ফাংশন প্যারামিটার ধরণের শীর্ষ স্তরে অনুমোদিত। সম্পর্কিত নিয়মটি হল [dcl.spec.auto] অনুচ্ছেদ 2 :

একটি স্থানধারক-টাইপ-সুনির্দিষ্টভাবে উল্লেখ করা ফর্মের টাইপ-বাধ্যতা [অপ্ট] autoহিসেবে ব্যবহার করা যেতে পারে ডিক্লেয়ার-সুনির্দিষ্টভাবে উল্লেখ করা এর ডিক্লেয়ার-সুনির্দিষ্টভাবে উল্লেখ করা-SeQ একটি এর প্যারামিটার-ঘোষণা একটি ফাংশন ঘোষণা বা ল্যামডা প্রকাশ যদি না হয় তাহলে, এবং auto টাইপ-স্পেসিফায়ার একটি ট্রেলিং-রিটার্ন-টাইপ (নীচে দেখুন) প্রবর্তন করা , একটি জেনেরিক প্যারামিটার প্রকারের স্থানধারক , এটি ফাংশন ঘোষণার বা ল্যাম্বডা-এক্সপ্রেশনটির । [দ্রষ্টব্য: জেনেরিক প্যারামিটারের ধরণের স্থানধারকটি হ'ল এটি বোঝায় যে ফাংশনটি সংক্ষেপিত ফাংশন টেম্পলেট (9.3.3.5 [dcl.fct]) বা ল্যাম্বডা একটি জেনেরিক ল্যাম্বডা (7.5.5 [এক্সপ্রেস.প্রিম.এলম্বদা])। অন্তর্ভুক্ত নোট]

(আপনি যদি লেখার সময় সর্বাধিক সাম্প্রতিক কার্যকরী খসড়ায় শব্দটি পরীক্ষা করেন তবে আপনি কিছুটা আলাদা নিয়ম পাবেন find উপরের নিয়মটি মূল ইস্যু ২৪4747 দ্বারা সংশোধন করা হয়েছিল, যা প্রাগের সি ++ ২০ এর চূড়ান্ত খসড়ায় ভোট হয়েছিল) এক সপ্তাহ আগে কমিটির সভা।)

ডিক্লেয়ার-সুনির্দিষ্টভাবে উল্লেখ করা একটি ফাংশন প্যারামিটার প্যারামিটার ঘোষণা শুরুতে কীওয়ার্ড এবং টাইপ নামের প্রাথমিক ক্রম মধ্যে s। উপরের নিয়মটি autoশীর্ষ স্তরে অনুমতি দেয় :

void f(auto x);

... তবে কেবল একটি ডেস্ক -স্পেসিফায়ার হিসাবে । autoযখন একটি ডেসাল-স্পেসিফায়ারের মধ্যে বাসা বাঁধার অনুমতি দেওয়া হয় না :

void f(std::vector<auto> x);

... এবং প্যারামিটার ধরণে অন্য কোথাও অনুমোদিত নয়:

void f(void (*p)(auto));

বাহ, আমি জানতাম না! সিডাব্লুজি লিঙ্কটি বর্তমানে ৪০৪ দেয়, সুতরাং আপনি কি এই বাধাটির যুক্তি সংক্ষেপে ব্যাখ্যা করতে পারবেন?
— এলএফ

এটি সম্পূর্ণ হতাশাব্যঞ্জক।
— ফিউরিশ

1
দুঃখিত, সিডাব্লুজি ইস্যু এবং এর শব্দটির পরিবর্তনটি সর্বজনীনভাবে এখনও দৃশ্যমান নয়। প্রশ্নে বিধিটি ওপেন- std.org/jtc1/sc22/wg21/docs/papers/2018/p1141r2.html দ্বারা প্রবর্তন করা হয়েছিল এবং আমরা ইতিমধ্যে জেনেরিক ল্যাম্বডাসের জন্য যে অনুমতি দিয়েছিলাম তার সাথে অভিপ্রায় / যুক্তিটি সামঞ্জস্য হতে হয়েছিল।
— রিচার্ড স্মিথ

4
@ এলএফ: সিডব্লুজি ইস্যু যাইহোক সত্যিই প্রাসঙ্গিক নয়: এটি একটি শব্দের ত্রুটি সংশোধন করেছিল যা বোঝায় যে autoএই জাতীয় autoব্যবহার হিসাবে গণ্য করা ট্রেলিং রিটার্ন টাইপের জন্য নির্দিষ্ট ব্যবহার।
— ডেভিস হ্যারিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.