Isso é válido em C ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
O GCC e o MSVC acham que está tudo bem, Clang acha que não: o Compiler Explorer .
Todos os compiladores concordam que este está correto: Explorer do compilador .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang novamente não gosta deste, mas os outros estão bem com ele: Explorador de Compiladores
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
O que há aqui em cima? Eu acho que a aritmética em ponteiros não relacionados é um comportamento indefinido, mas __func__
retorna o mesmo ponteiro, não? Não tenho certeza, então pensei em testá-lo. Se bem me lembro, std::equal_to
pode comparar ponteiros não relacionados sem comportamento indefinido:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang acha que eq(__func__, __func__)
não é uma expressão constante, mesmo que std::equal_to::operator()
seja consexpr . Outros compiladores não reclamam: Compiler Explorer
Clang também não compilará este. Reclama que __func__ == __func__
não é uma expressão constante: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
e uso que no static_assert ...
__func__
inteiramente da avaliação constexpr.
__func__
é tão-sestatic const char __func__[] = "function-name";
e que equivale é aceito demo ...