Czy to jest poprawny C ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC i MSVC uważają, że jest w porządku, Clang uważa, że tak nie jest: Compiler Explorer .
Wszystkie kompilatory zgadzają się, że ten jest w porządku: Eksplorator kompilatorów .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clangowi znów się to nie podoba, ale inni się z tym zgadzają : Eksplorator kompilatorów
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Co tu jest Myślę, że arytmetyka niepowiązanych wskaźników jest nieokreślonym zachowaniem, ale __func__zwraca ten sam wskaźnik, prawda? Nie jestem pewien, więc pomyślałem, że mogę to przetestować. Jeśli dobrze pamiętam, std::equal_tomogę porównać niepowiązane wskaźniki bez niezdefiniowanego zachowania:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang uważa, że eq(__func__, __func__)nie jest stałym wyrażeniem, chociaż std::equal_to::operator() jest constexpr . Inne kompilatory nie narzekają: Eksplorator kompilatorów
Clang też tego nie skompiluje. Skarży się, że __func__ == __func__nie jest stałym wyrażeniem: Eksplorator kompilatora
int main() {
static_assert(__func__ == __func__);
}
__func__i użyjesz jej w static_assert ...
__func__całkowicie usunąć z oceny constexpr.
__func__jest tak-jeślistatic const char __func__[] = "function-name";i to jest akceptowane odpowiednik Demo ...