Questo C ++ è valido?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC e MSVC pensano che sia OK, Clang pensa che non lo sia: Compiler Explorer .
Tutti i compilatori concordano sul fatto che questo è OK: Compiler Explorer .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Di nuovo Clang non piace questo, ma gli altri sono d'accordo: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Cosa c'è quassù? Penso che l'aritmetica su puntatori non correlati sia un comportamento indefinito ma __func__
restituisce lo stesso puntatore, no? Non ne sono sicuro, quindi ho pensato di provarlo. Se ricordo bene, è std::equal_to
possibile confrontare i puntatori non correlati senza un comportamento indefinito:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang pensa che eq(__func__, __func__)
non sia un'espressione costante, anche se std::equal_to::operator()
è constexpr . Gli altri compilatori non si lamentano: Compiler Explorer
Anche Clang non compilerà questo. Si lamenta che __func__ == __func__
non sia un'espressione costante: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
e la si utilizza in static_assert ...
__func__
completamente dalla valutazione di constexpr.
__func__
è come-sestatic const char __func__[] = "function-name";
e