আমি দেখেছি যে lvalue
ল্যাম্বদা ক্লোজারগুলি সর্বদা rvalue
ফাংশন পরামিতি হিসাবে পাস করা যায় ।
নিম্নলিখিত সহজ বিক্ষোভ দেখুন।
#include <iostream>
#include <functional>
using namespace std;
void foo(std::function<void()>&& t)
{
}
int main()
{
// Case 1: passing a `lvalue` closure
auto fn1 = []{};
foo(fn1); // works
// Case 2: passing a `lvalue` function object
std::function<void()> fn2 = []{};
foo(fn2); // compile error
return 0;
}
কেস 2 হ'ল মানক আচরণ (আমি কেবল std::function
প্রদর্শনের উদ্দেশ্যে ব্যবহার করেছি, তবে অন্য কোনও ধরণের আচরণ একই রকম হবে)।
কেস 1 কেন এবং কেন কাজ করে? fn1
ফাংশন ফিরে আসার পরে বন্ধের অবস্থা কী ?
std::function
ল্যাম্বডা থেকে আর্গুমেন্টগুলি ছাঁটাই করা যায় না কেন "। আপনার প্রোগ্রামটি টেমপ্লেট আর্গুমেন্টগুলি কমাতে চেষ্টা করে না std::function
, সুতরাং অন্তর্নিহিত রূপান্তর নিয়ে কোনও সমস্যা নেই।
std::function
লাম্বদা ক্লোজারকে স্বীকার করে এমন একটি স্পষ্টত নির্মাতা নির্মাণকারী রয়েছে, সুতরাং অন্তর্নিহিত রূপান্তর রয়েছে। তবে সংযুক্ত প্রশ্নের পরিস্থিতিতে std::function
ল্যাম্বদা টাইপ থেকে টেমপ্লেট ইনস্ট্যান্টেশন অনুমান করা যায় না। (উদাহরণস্বরূপ এটির অ- std::function<void()>
[](){return 5;}
fn1
অন্তর্নিহিতভাবে একটিstd::function
ইন-এ রূপান্তরিত হয়েছেfoo(fn1)
। সেই অস্থায়ী ফাংশনটি তখন একটি মূল্যবান।