Ist das gültiges C ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC und MSVC denken, dass es in Ordnung ist, Clang denkt, dass es nicht: Compiler Explorer .
Alle Compiler sind sich einig, dass dies in Ordnung ist: Compiler Explorer .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang mag dieses wieder nicht, aber die anderen sind damit einverstanden: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Was ist hier oben? Ich denke, Arithmetik für nicht verwandte Zeiger ist undefiniertes Verhalten, __func__
gibt aber den gleichen Zeiger zurück, nein? Ich bin mir nicht sicher, also dachte ich, ich könnte es testen. Wenn ich mich richtig erinnere, std::equal_to
können nicht verwandte Zeiger ohne undefiniertes Verhalten verglichen werden:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang denkt, dass dies eq(__func__, __func__)
kein konstanter Ausdruck ist, obwohl er std::equal_to::operator()
constexpr ist . Andere Compiler beschweren sich nicht: Compiler Explorer
Clang wird diesen auch nicht kompilieren. Beschwert sich, dass dies __func__ == __func__
kein konstanter Ausdruck ist: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
und diese im static_assert verwenden ...
__func__
vollständig aus der Constexpr-Bewertung entfernt wird.
__func__
ist als-obstatic const char __func__[] = "function-name";
und gleichwertig akzeptiert Demo ...