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


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.