क्या यह वैध सी ++ है?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC और MSVC को लगता है कि यह ठीक है, क्लैंग को लगता है कि यह नहीं है: कंपाइलर एक्सप्लोरर ।
सभी कंपाइलर सहमत हैं कि यह एक ठीक है: कंपाइलर एक्सप्लोरर ।
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";
और उस बराबर स्वीकार किया जाता है डेमो ...