Это действительный C ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC и MSVC считают, что все в порядке, Clang считает, что это не так: Compiler Explorer .
Все компиляторы соглашаются, что с этим все в порядке: Compiler Explorer .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang снова не нравится этот, но другие в порядке с этим: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Что здесь? Я думаю, что арифметика на несвязанных указателях - неопределенное поведение, но __func__
возвращает тот же самый указатель, нет? Я не уверен, поэтому я подумал, что могу это проверить. Если я правильно помню, std::equal_to
можно сравнить несвязанные указатели без неопределенного поведения:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Кланг считает, что eq(__func__, __func__)
это не постоянное выражение, хотя std::equal_to::operator()
является constexpr . Другие компиляторы не жалуются: Compiler Explorer
Clang тоже не скомпилирует. Жалуется, что __func__ == __func__
не является константным выражением: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
и используете ее в static_assert ...
__func__
полностью удалить из оценки constexpr.
__func__
как если бы,static const char __func__[] = "function-name";
и этот эквивалент принимается Демо ...