জেনেরিক কোডে রিটার্ন টাইপ ফরোয়ার্ডিং
জেনেরিক কোডের জন্য, আপনি যে প্রাথমিক উদাহরণ দিয়েছেন তার মতো আপনিও রিটার্নের ধরণ হিসাবে একটি রেফারেন্স পেতে ম্যানুয়ালি নির্বাচন করতে পারেন:
auto const& Example(int const& i)
{
return i;
}
তবে জেনেরিক কোডে আপনি কোনও রেফারেন্স বা কোনও মান নিয়ে কাজ করছেন কিনা তা জেনেও আপনি কোনও রিটার্ন টাইপ পুরোপুরি ফরোয়ার্ড করতে সক্ষম হতে চান । decltype(auto)
আপনাকে সেই ক্ষমতা দেয়:
template<class Fun, class... Args>
decltype(auto) Example(Fun fun, Args&&... args)
{
return fun(std::forward<Args>(args)...);
}
পুনরাবৃত্তাকার টেম্পলেটগুলিতে রিটার্নের ধরণের কাটা বিলম্ব করছে
ইন এই Q & A- কয়েক দিন আগে, ফর্মা ইনস্ট্যান্স সময় একটি অসীম recursion যখন টেমপ্লেটের রিটার্ন টাইপ হিসাবে নির্দিষ্ট সম্মুখীন হয়েছিল decltype(iter(Int<i-1>{}))
পরিবর্তে decltype(auto)
।
template<int i>
struct Int {};
constexpr auto iter(Int<0>) -> Int<0>;
template<int i>
constexpr auto iter(Int<i>) -> decltype(auto)
{ return iter(Int<i-1>{}); }
int main() { decltype(iter(Int<10>{})) a; }
decltype(auto)
টেম্পলেট ইনস্ট্যান্টেশনের ধুলো স্থির হয়ে যাওয়ার পরে রিটার্ন টাইপ ছাড়ের ক্ষেত্রে বিলম্ব করতে এখানে ব্যবহৃত হয় ।
অন্যান্য ব্যবহার
আপনি decltype(auto)
অন্যান্য প্রসঙ্গেও ব্যবহার করতে পারেন , যেমন স্ট্যান্ডার্ড N3936 খসড়াটিও জানিয়েছে
.1.১..4.৪ অটো স্পেসিওর [dcl.spec.auto]
1 auto
এবং decltype(auto)
টাইপ-স্পেসিফিক্স একটি স্থানধারক প্রকার নির্ধারণ করে যা পরে পরিবর্তিত হবে, তা হয় আরম্ভকারী থেকে ছাড়ের মাধ্যমে বা স্পষ্টভাবে স্পেসিফিকেশন দ্বারা ট্রেলিং-রিটার্ন-টাইপের মাধ্যমে। auto
টাইপ-সুনিন্টি ফাই Er এছাড়াও বোঝান যে একটি ল্যামডা একটি জেনেরিক ল্যামডা ব্যবহৃত হয়।
2 ডেস্ক -স্পেসিফায়ার-সেক, টাইপ-স্পেসিফায়ার-সেক, রূপান্তর-ফাংশন-আইডি, বা ট্রেলিং-রিটার্ন-টাইপ, যেখানে এই ধরণের ডিক্লেয়ারের বৈধতা রয়েছে সেই স্থানধারক প্রকারটি কোনও ফাংশন ডিক্লেয়ারের সাথে উপস্থিত হতে পারে । যদি ফাংশন ডিক্লেয়ারারে একটি ট্রেলিং-রিটার্ন-টাইপ (8.3.5) থাকে তবে এটি ফাংশনের ঘোষিত রিটার্নের ধরণ নির্দিষ্ট করে। যদি ফাংশনটির ঘোষিত রিটার্ন টাইপটিতে কোনও স্থানধারক প্রকার থাকে তবে ফাংশনের রিটার্ন টাইপটি ফাংশনের শরীরে রিটার্নের স্টেটমেন্ট থেকে বাদ দেওয়া হয়, যদি থাকে।
খসড়াটিতে পরিবর্তনশীল সূচনা করার উদাহরণও রয়েছে:
int i;
int&& f();
auto x3a = i; // decltype(x3a) is int
decltype(auto) x3d = i; // decltype(x3d) is int
auto x4a = (i); // decltype(x4a) is int
decltype(auto) x4d = (i); // decltype(x4d) is int&
auto x5a = f(); // decltype(x5a) is int
decltype(auto) x5d = f(); // decltype(x5d) is int&&
auto x6a = { 1, 2 }; // decltype(x6a) is std::initializer_list<int>
decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression
auto *x7a = &i; // decltype(x7a) is int*
decltype(auto)*x7d = &i; // error, declared type is not plain decltype(auto)