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_to
mogę 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 ...