অদ্ভুত ভাষা ইস্যুটি সিডাব্লুজি 1581 :
ধারা 15 [বিশেষ] পুরোপুরি স্পষ্ট যে বিশেষ সদস্য ফাংশনগুলি কেবল গন্ধযুক্ত-ব্যবহৃত হলে কেবল সুস্পষ্টভাবে সংজ্ঞায়িত হয়। এটি অমূল্য প্রসঙ্গে নিয়মিত প্রকাশের জন্য একটি সমস্যা তৈরি করে:
struct duration {
constexpr duration() {}
constexpr operator int() const { return 0; }
};
// duration d = duration(); // #1
int n = sizeof(short{duration(duration())});
এখানে সমস্যাটি হ'ল আমাদের constexpr duration::duration(duration&&)
এই প্রোগ্রামটিতে স্পষ্টভাবে সংজ্ঞায়িত করার অনুমতি নেই , সুতরাং প্রারম্ভিকের তালিকায় প্রকাশটি একটি ধ্রুবক প্রকাশ নয় (কারণ এটি একটি কনসেক্সট্রিপ ফাংশনকে ডাকে যা সংজ্ঞায়িত হয়নি), তাই বন্ধনীযুক্ত আরম্ভকারীটি সংকীর্ণ রূপান্তর ধারণ করে সুতরাং, প্রোগ্রামটি দুর্গঠিত।
যদি আমরা লাইন # 1টিকে আপত্তিহীন করি, তবে মুভ কনস্ট্রাক্টর সুস্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে এবং প্রোগ্রামটি বৈধ। দূরত্বে এই ভুতুড়ে কাজটি অত্যন্ত দুর্ভাগ্যজনক। বাস্তবায়নগুলি এই পয়েন্টে ডাইভারেজ করে।
আপনি ইস্যুটির বাকী বিবরণ পড়তে পারেন।
এই ইস্যুটির জন্য একটি প্রস্তাব 2017 সালে আলবুকার্কে P0859 এ গৃহীত হয়েছিল (সি ++ 17 প্রেরণের পরে)। উভয়ই C ++ 20 এর জন্য ( P0879 এconstexpr std::swap
সমাধান করা ) এবং একটি ( P1065-এ সমাধান করা , যার CWG1581 উদাহরণ রয়েছে) উভয়ই রাখতে সক্ষম হওয়ায় এই সমস্যাটি ব্লককারী ছিল ।constexpr std::invoke
এখানে সবচেয়ে সহজ উদাহরণটি বোঝার জন্য, আমার মতে, এল 10 ভিএম বাগ রিপোর্টের কোডটি পি 1065-তে নির্দেশিত:
template<typename T>
int f(T x)
{
return x.get();
}
template<typename T>
constexpr int g(T x)
{
return x.get();
}
int main() {
// O.K. The body of `f' is not required.
decltype(f(0)) a;
// Seems to instantiate the body of `g'
// and results in an error.
decltype(g(0)) b;
return 0;
}
CWG1581 সম্পর্কে সব হয় যখন constexpr সদস্য ফাংশন সংজ্ঞায়িত করা হয়, এবং রেজল্যুশন নিশ্চিত করে যে তারা শুধুমাত্র যখন ব্যবহৃত সংজ্ঞায়িত করছি। P0859 পর উপরে সুগঠিত হয় (ধরণ b
হয় int
)।
যেহেতু std::swap
এবং std::invoke
উভয়কেই সদস্য ফাংশনগুলির জন্য পরীক্ষা করা (পূর্বে নির্মাণ কল / কার্যক্রমে এবং পরবর্তী কলের অপারেটর / সারোগেট কলগুলি) পরবর্তী সময়ে এই সমস্যার সমাধানের উপর নির্ভর করে।