¿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_to
puedo 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 ...