Apakah ini C ++ yang valid?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC dan MSVC berpikir tidak apa-apa, Clang berpikir itu tidak: Compiler Explorer .
Semua kompiler setuju bahwa ini OK: Kompiler Explorer .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Dentang lagi tidak suka yang ini, tapi yang lain tidak masalah dengan itu: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Ada apa di sini? Saya pikir aritmatika pada pointer yang tidak berhubungan adalah perilaku yang tidak terdefinisi tetapi __func__
mengembalikan pointer yang sama, bukan? Saya tidak yakin, jadi saya pikir saya bisa mengujinya. Jika saya ingat dengan benar, std::equal_to
dapat membandingkan pointer yang tidak terkait tanpa perilaku yang tidak terdefinisi:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Dentang berpikir eq(__func__, __func__)
bukan ekspresi konstan, meskipun std::equal_to::operator()
adalah constexpr . Kompiler lain tidak mengeluh: Kompiler Explorer
Dentang juga tidak akan mengkompilasi yang ini. Keluhan yang __func__ == __func__
bukan ekspresi konstan: Kompiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
dan menggunakannya di static_assert ...
__func__
seluruhnya dari evaluasi constexpr.
__func__
as-ifstatic const char __func__[] = "function-name";
dan yang setara diterima Demo ...