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_tokö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 ...