আমি প্রায় খেলে গেল autoমধ্যে std::pair। নীচের কোডে, ফাংশনটি fএমন কোনও std::pairধরণের ফেরত দেওয়ার কথা যা কোনও টেম্পলেট প্যারামিটারের উপর নির্ভর করে।
একটি কার্যকরী উদাহরণ:
উদাহরণ 1
template <unsigned S>
auto f()
{
if constexpr (S == 1)
return std::pair{1, 2}; // pair of ints
else if constexpr (S == 2)
return std::pair{1.0, 2.0}; // pair of doubles
else
return std::pair{0.0f, 0.0f}; // pair of floats
}
এটি জিসিসি 9.2, জিসিসি 10.0, ক্ল্যাং 9.0 এবং ক্ল্যাং 10.0 নিয়ে কাজ করে।
এরপরে, আমি std::pairপরিষ্কারভাবে কারণে রিটার্নের ধরণটি স্পষ্টভাবে লিখতে চেয়েছিলাম :
উদাহরণ 2
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return {1, 2};
/* ... */
}
জিসিসি 9.2 / 10.0 এবং ক্ল্যাং 9.0 / 10.0 উভয়ই এটি সঙ্কলন করতে ব্যর্থ হয়েছিল।
জিসিসি 9.2
error: invalid use of 'auto'
error: template argument 1 is invalid // first argument (auto) of std::pair
error: template argument 2 is invalid // second argument (auto) of std::pair
error: cannot convert '<brace-enclosed initializer list>' to 'int' in return
শেষ ত্রুটি বার্তা থেকে, gcc 9.2 মনে হয় যে std::pair<auto, auto>এটি একটি int। কিভাবে এই ব্যাখ্যা করা যেতে পারে?
জিসিসি 10.0
error: returning initializer list
এই ত্রুটিটি বোধগম্য, তবে আমি নির্মাণকারীকে std::pairআহবান করার প্রত্যাশা করলাম , বা এখানে আমি এখানে কিছু অনুপস্থিত রয়েছি?
ঝনঝন 9.0 এবং 10.0
'auto' not allowed in template argument
excess elements in scalar initializer
no matching function for call to 'f'
ঠিক আছে, ঝনঝন করা এগুলির কোনও পছন্দ করে না। দ্বিতীয় ত্রুটি বার্তা থেকে, মনে হয় যে ঝাঁকুনি বিশ্বাস করে যে রিটার্নের ধরণটি int।
অবশেষে, জিসিসি 10.0 এর সাথে সংকলিত প্রাপ্ত ত্রুটিটি ঠিক করার জন্য, আমি std::pairস্পষ্টতই ফিরে আসার সিদ্ধান্ত নিয়েছি :
উদাহরণ 3
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return std::pair{1, 2};
/* ... */
}
ঝনঝন 9.0 এবং 10.0
আগের মত একই, তবে অতিরিক্ত সহ:
no viable conversion from returned value of type 'std::pair<int, int>' to function return type 'int'
এখানে ঝনঝনানি এখনও মনে করে আমরা একটি ফিরে আসছি int?
জিসিসি 9.2
পূর্বের মত.
জিসিসি 10.0
এটি কাজ করে!
আমার ধারণা কিছু বৈশিষ্ট্য এখনও প্রয়োগ করতে হবে, বা উপরে বর্ণিত পরিস্থিতিতে একটিতে কি এমন একটি সংকলক আছে যা সঠিক এবং অন্যটি ভুল? আমার মতে, উদাহরণ 2 কাজ করা উচিত। না এটা করা উচিত?