¿Es esto válido C ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC y MSVC piensan que está bien, Clang cree que no: Compiler Explorer .
Todos los compiladores están de acuerdo en que este está bien: Compiler Explorer .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
A Clang nuevamente no le gusta este, pero los otros están de acuerdo: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
¿Qué hay aquí arriba? Creo que la aritmética en punteros no relacionados es un comportamiento indefinido pero __func__devuelve el mismo puntero, ¿no? No estoy seguro, así que pensé que podría probarlo. Si recuerdo correctamente, std::equal_topuedo comparar punteros no relacionados sin un comportamiento indefinido:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang piensa eq(__func__, __func__)que no es una expresión constante, aunque std::equal_to::operator() es constexpr . Otros compiladores no se quejan: Compiler Explorer
Clang tampoco compilará este. Se queja de que __func__ == __func__no es una expresión constante: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__y la usa en static_assert ...
__func__completo de la evaluación constexpr.
__func__es como sistatic const char __func__[] = "function-name";y ese equivalente es aceptado Demo ...