অন্যান্য উত্তরগুলি অসুবিধাগুলির উল্লেখ করে যেমন "ভেরিয়েবলের ধরণ কী তা আপনি সত্যিই জানেন না।" আমি বলব যে এটি মূলত কোডের opালু নামকরণের কনভেনশনের সাথে সম্পর্কিত। যদি আপনার ইন্টারফেসগুলি স্পষ্টরূপে নামকরণ করা হয় তবে সঠিক ধরণটি কী তা আপনার যত্নের দরকার নেই। অবশ্যই, auto result = callSomeFunction(a, b);
আপনাকে বেশি কিছু বলে না। তবে এর সঠিক প্রকারটি কী তা চিন্তা না করেই auto valid = isValid(xmlFile, schema);
আপনাকে যথেষ্ট পরিমাণে ব্যবহার করার জন্য আপনাকে বলে valid
। সর্বোপরি, ন্যায়সঙ্গতভাবে if (callSomeFunction(a, b))
, আপনি টাইপটিও জানতেন না। অন্য কোনও subexpression অস্থায়ী বস্তুর সাথে একই। সুতরাং আমি এটিকে সত্যিকারের অপূর্ণতা মনে করি না auto
।
আমি বলব এর প্রাথমিক অসুবিধাটি হ'ল কখনও কখনও, সঠিক রিটার্ন টাইপটি আপনি কাজ করতে চান তা নয় । ফলস্বরূপ, কখনও কখনও বাস্তব রিটার্ন টাইপ বাস্তবায়ন / অপ্টিমাইজেশনের বিশদ হিসাবে "যৌক্তিক" রিটার্ন টাইপের থেকে আলাদা হয়। এক্সপ্রেশন টেম্পলেট একটি প্রধান উদাহরণ। ধরা যাক আমাদের এটি আছে:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
কথাটি, আমরা আশা SomeType
হতে Vector
, এবং আমরা স্পষ্টভাবে আমাদের কোডে যেমন এটা বিবেচনা করতে চাই। তবে এটি সম্ভব যে অপ্টিমাইজেশনের উদ্দেশ্যে, বীজগণিত গ্রন্থাগার আমরা প্রয়োগকারী এক্সপ্রেশন টেম্পলেট ব্যবহার করি এবং আসল প্রত্যাবর্তনের ধরণটি হ'ল:
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
এখন, সমস্যাটি হ'ল MultExpression<Matrix, Vector>
সমস্ত সম্ভাবনা একটি const Matrix&
এবং const Vector&
অভ্যন্তরীণভাবে সঞ্চয় করবে ; এটি প্রত্যাশা করে যে এটি Vector
তার পূর্ণ-প্রকাশের সমাপ্তির আগে একটিতে রূপান্তরিত হবে । আমাদের যদি এই কোডটি থাকে তবে সব ঠিক আছে:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
তবে, আমরা যদি auto
এখানে ব্যবহার করতাম তবে আমরা সমস্যায় পড়তে পারি:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}