Est-ce un C ++ valide?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC et MSVC pensent que c'est OK, Clang pense que ce n'est pas le cas: Compiler Explorer .
Tous les compilateurs conviennent que celui-ci est OK: Explorateur de compilateurs .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang n'aime pas encore celui-ci, mais les autres sont d'accord avec lui: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Qu'est-ce qu'il y a ici? Je pense que l'arithmétique sur les pointeurs non liés est un comportement indéfini mais __func__
renvoie le même pointeur, non? Je ne suis pas sûr, alors j'ai pensé que je pourrais le tester. Si je me souviens bien, std::equal_to
peut comparer des pointeurs indépendants sans comportement indéfini:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang pense que ce eq(__func__, __func__)
n'est pas une expression constante, même si std::equal_to::operator()
c'est constexpr . Les autres compilateurs ne se plaignent pas: Explorateur de compilateurs
Clang ne compilera pas celui-ci non plus. Se plaint que ce __func__ == __func__
n'est pas une expression constante: Explorateur du compilateur
int main() {
static_assert(__func__ == __func__);
}
__func__
et l'utilisez dans le static_assert ...
__func__
entièrement supprimé de l'évaluation constexpr.
__func__
est comme sistatic const char __func__[] = "function-name";
et cet équivalent est accepté Démo ...