auto এবং decltype দুটি ভিন্ন উদ্দেশ্যে কাজ করে তাই এগুলো একে অপরের সাথে একে একে ম্যাপ হয় না। auto হলো C++11 এবং পরবর্তীতে একটি কীওয়ার্ড যা অটোমেটিক টাইপ ডিডাকশনের জন্য ব্যবহৃত হয়। decltype টাইপ স্পেসিফায়ার একটি নির্দিষ্ট এক্সপ্রেশনের টাইপ দেয়। auto ভেরিয়েবলে অ্যাসাইন করা ভ্যালু থেকে টাইপ অনুমান করে, অন্যদিকে decltype এটিকে পাস করা এক্সপ্রেশন থেকে টাইপ অনুমান করে। decltype দ্বারা রিটার্ন করা ভ্যালু সরাসরি অন্য একটি ভেরিয়েবল ডিফাইন করতে ব্যবহার করা যায়।
auto টেমপ্লেট প্যারামিটার ডিডাকশনের নিয়ম মেনে চলে। এই নিয়মগুলো সম্পর্কে আরও পড়তে পারেন এখানে।
decltype-এর যে নিয়মগুলো মানতে হয় সেগুলো স্ট্যান্ডার্ডে ডিফাইন করা আছে। স্ট্যান্ডার্ড থেকে এই নিয়মগুলোর একটি অংশ নিচে দেওয়া হলো:
sizeof অপারেটরের মতো, decltype-এর অপারেন্ড unevaluated (ইভ্যালুয়েট হয় না)। অনফরম্যালি, decltype(e) দ্বারা রিটার্ন করা টাইপ নিচের মতো ডিডাক্ট করা হয়:
- যদি এক্সপ্রেশন
eকোনো লোকাল বা নেমস্পেস স্কোপের ভেরিয়েবল, স্ট্যাটিক মেম্বার ভেরিয়েবল, বা ফাংশন প্যারামিটারকে রেফার করে, তবে রেজাল্ট হবে সে ভেরিয়েবল বা প্যারামিটারের ডিক্লেয়ারড টাইপ। - যদি
eএকটি ফাংশন কল বা ওভারলোডেড অপারেটর ইনভোকেশন হয়, তবেdecltype(e)সে ফাংশনের ডিক্লেয়ারড রিটার্ন টাইপকে ডেনোট করে। - অন্যথায়, যদি
eএকটি lvalue হয়, তবেdecltype(e)হবেT&, যেখানেTহলোe-র টাইপ; যদিeএকটি rvalue হয়, তবে রেজাল্ট হবেT।
এই সেম্যান্টিক্স ジェネরিক লাইব্রেরি রাইটির প্রয়োজন মেটাতে এবং একই সময় নভিস প্রোগ্রামারদের জন্য ইন্টুইটিভ বানাতে ডিজাইন করা হয়েছে, কারণ decltype-এর রিটার্ন টাইপ সবসময় সোর্স কোডে ডিক্লেয়ার করা অবজেক্ট বা ফাংশনের টাইপের সাথে এক্সাক্টলি মেলে। আরও ফরম্যালি, রুল ১ আনপ্যারেনথেসাইজড id-এক্সপ্রেশন এবং ক্লাস মেম্বার অ্যাক্সেস এক্সপ্রেশনে প্রযোজ্য। ফাংশন কলের জন্য, ডিডাক্টেড টাইপ হলো স্ট্যাটিক্যালি চোজেন ফাংশনের রিটার্ন টাইপ, যা ওভারলোড রেজোলিউশনের নিয়ম অনুযায়ী নির্ধারিত হয়।
উদাহরণ
auto এবং decltype ব্যবহার করে উদাহরণ:
#include <iostream>
#include <vector>
using namespace std;
int main() {
// auto ব্যবহার করে টাইপ ডিডাকশন
vector<int> arr(10);
for(auto it = arr.begin(); it != arr.end(); it++) {
cin >> *it;
}
// decltype ব্যবহার করে টাইপ ডিডাকশন
vector<int> arr2(10);
for (decltype(arr2.begin()) it = arr2.begin(); it != arr2.end(); it++) {
cin >> *it;
}
return 0;
}
নোট: decltype দ্বারা ডেনোট করা টাইপ auto দ্বারা ডিডাক্ট করা টাইপ থেকে ভিন্ন হতে পারে। এই সূক্ষ্ম পার্থক্যগুলোর ওপর আরও জানতে আপনি এই ১২ পেজের এক্সপ্লানেশন পড়তে পারেন: Type Deduction in C++