এটি কি বৈধ সি ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
জিসিসি এবং এমএসভিসি মনে করে এটি ঠিক আছে, কলং মনে করেন এটি ঠিক নয়: সংকলক এক্সপ্লোরার ।
সমস্ত সংকলক সম্মত হন যে এটি ঠিক আছে: সংকলক এক্সপ্লোরার ।
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
ঝাঁকুনি আবার এটি পছন্দ করে না, তবে অন্যরা এটির সাথে ঠিক আছে: সংকলক এক্সপ্লোরার
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
এখানে কি? আমার মনে হয় সম্পর্কহীন পয়েন্টারগুলিতে গাণিতিকটি সংজ্ঞায়িত আচরণ তবে __func__
একই পয়েন্টারটি ফেরত দেয়, না? আমি নিশ্চিত নই, তাই আমি ভেবেছিলাম আমি এটি পরীক্ষা করতে পারি। আমি যদি সঠিকভাবে স্মরণ করি তবে অপরিবর্তিত std::equal_to
আচরণ ব্যতীত সম্পর্কহীন পয়েন্টারগুলির তুলনা করতে পারি:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
ক্লেং মনে করে যে eq(__func__, __func__)
এটি একটি ধ্রুবক অভিব্যক্তি নয়, যদিও std::equal_to::operator()
কনটেক্সটপ্রপ হয় । অন্যান্য সংকলক অভিযোগ করবেন না: সংকলক এক্সপ্লোরার
ঝনঝন এটি একটিও সংকলন করবে না। অভিযোগগুলি যা __func__ == __func__
কোনও ধ্রুবক প্রকাশ নয়: সংকলক এক্সপ্লোরার
int main() {
static_assert(__func__ == __func__);
}
__func__
এবং ব্যবহারের যে static_assert করুন ...
__func__
সম্পূর্ণরূপে কনটেক্সপ মূল্যায়ন থেকে মুছে ফেলা হতে পারে ।
__func__
হিসাবে যদিstatic const char __func__[] = "function-name";
এবং যে সমতুল্য গৃহীত ডেমো ...