Чи дійсно це C ++?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC та MSVC вважають, що це нормально, Кланг вважає, що це не так: Compiler Explorer .
Усі компілятори погоджуються, що це нормально: Провідник компілятора .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Клангу знову це не подобається, але з ним все в порядку: 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()
це конспектр . Інші компілятори не скаржаться: Compiler Explorer
Кланг також не збиратиме цей. Скарги, що __func__ == __func__
не є постійним виразом: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
і використовувати його в static_assert ...
__func__
повністю вилучатися з оцінки конспектора.
__func__
це як-нібиstatic const char __func__[] = "function-name";
і цей еквівалент приймається Демо ...