ক্যাপচারলেস ল্যাম্বদা মানক দ্বারা খালি থাকার গ্যারান্টিযুক্ত?


12

আমি একটি টেমপ্লেট ফাংশনে অন্যান্য ল্যাম্বডাস থেকে খালি (ক্যাপচারহীন) ল্যাম্বডাস সনাক্ত করার একটি উপায় অনুসন্ধান করছি। আমি বর্তমানে সি ++ 17 ব্যবহার করছি তবে আমি সি ++ ২০ টি উত্তরও জানতে আগ্রহী।

আমার কোডটি এর মতো দেখাচ্ছে:

template<typename T>
auto func(T lambda) {
    // The aguments of the lambdas are unknown

    if constexpr (/* is captureless */) {
        // do stuff
    }
}

এটি কি সি ++ স্ট্যান্ডার্ড (17 বা 20) দ্বারা গ্যারান্টিযুক্ত যে কোনও ক্যাপচারহীন ল্যাম্বদা, যা একটি ফাংশন পয়েন্টারে রূপান্তরযোগ্য, এছাড়াও std::is_emptyফলন সত্য করে তুলবে ?

একটি উদাহরণ হিসাবে এই কোড নিন:

auto a = []{}; // captureless
auto b = [c = 'z']{}; // has captures

static_assert(sizeof(a) == sizeof(b)); // Both are the same size
static_assert(!std::is_empty_v<decltype(b)>); // It has a `c` member
static_assert(std::is_empty_v<decltype(a)>); // Passes. It is guaranteed?

সরাসরি উদাহরণ


2
যদি আপনি কেবল অ-টেম্পলেট ল্যাম্বডাসের বিষয়ে চিন্তা করেন তবে আপনি কোনও ফাংশন পয়েন্টার ( +lambda) এর রূপান্তরটি সু-গঠিত কিনা তা পরীক্ষা করতে আপনি SFINAE ব্যবহার করতে পারেন ।
হলি ব্ল্যাককিট

@ হোলিব্ল্যাকগ্যাট আমি সে সম্পর্কে ভেবেছিলাম, তবে যতদূর আমার মনে আছে, এমএসভিসি এটির অনুমতি দেয় না যেহেতু তারা রূপান্তর অপারেটরটিকে ওভারলোড করেছে।
গিলাইম র্যাকিকোট

@ গুইলাউম্যারাসিকোট এমএস সমস্ত উপলভ্য কলিং কনভেনশনের জন্য একটি পৃথক রূপান্তর অপারেটরটি প্রকাশ করেছে। কেবল একটি বাছাই করুন এবং ল্যাম্বডাকে একটি তুলনামূলক ফাংশন পয়েন্টারে রূপান্তর করার চেষ্টা করুন এবং পরীক্ষা করুন যে এটি সফল হয় বা ব্যর্থ হয় কিনা।
রেমি লিবিউ

+এখানে কাজ মনে হচ্ছে ।
হলিব্ল্যাকগেট

উত্তর:


13

না, প্রকৃতপক্ষে, স্ট্যান্ডার্ড স্পষ্টভাবে ল্যাম্বডাসকে এমন একটি আকার রাখার অনুমতি দেয় যা তাদের ঘোষণার সাথে সামঞ্জস্য হয় না। [expr.prim.lambda.closure] / 2 টি রাষ্ট্র

ক্লোজার টাইপটি ক্ষুদ্রতম ব্লক স্কোপ, ক্লাস স্কোপ বা নেমস্পেস স্কোপটিতে সম্পর্কিত লাম্বদা-এক্সপ্রেশন যুক্ত হিসাবে ঘোষণা করা হয় contains [দ্রষ্টব্য: এটি ক্লোজার টাইপের ([বেসিক.লুপআপ.আরগডেপ]) সাথে যুক্ত নেমস্পেস এবং ক্লাসগুলির সেট নির্ধারণ করে। ল্যাম্বডা-ডিক্লেটারের প্যারামিটার ধরণেরগুলি এই সম্পর্কিত নেমস্পেস এবং ক্লাসগুলিকে প্রভাবিত করে না। - শেষ দ্রষ্টব্য] ক্লোজার টাইপ একটি সামগ্রিক প্রকার নয়। কোনও বাস্তবায়ন নীচের বর্ণিত বর্ণনার চেয়ে ক্লোজারের ধরণকে আলাদাভাবে সংজ্ঞায়িত করতে পারে তবে শর্ত থাকে যে এটি পরিবর্তনের পরিবর্তে প্রোগ্রামটির পর্যবেক্ষণযোগ্য আচরণকে পরিবর্তন করে না:

  • আকার এবং / অথবা ক্লোজার ধরণের প্রান্তিককরণ,

  • বন্ধের ধরণটি তুচ্ছভাবে অনুলিপিযোগ্য ([শ্রেণী.প্রপ]), বা (২.৩)

  • বন্ধের ধরণটি একটি স্ট্যান্ডার্ড-লেআউট শ্রেণি ([শ্রেণি.প্রপ]) কিনা।

একটি বাস্তবায়নের ফলে রুল্যু রেফারেন্স টাইপের সদস্যদের ক্লোজার টাইপের সাথে যুক্ত করা হবে না।

জোর আমার

সুতরাং এটি বাস্তবায়নের ফলে ল্যাম্বডাকে একটি সদস্য দেওয়ার সুযোগ দেয় যদিও তা ক্যাপচার-কম হলেও। আমি মনে করি না যে কোনও বাস্তবায়ন কখনও হবে তবে তাদের আইনীভাবে এটি করার অনুমতি দেওয়া হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.