Добавить constexpr к __func__

WPMGPRoSToTeMa
WPMGPRoSToTeMa

Имя функции известно во время компиляции, так что логично, чтобы его можно было использовать в constexpr выражениях.

10
рейтинг
10 комментариев
smertigdon
Кхм..
__FUNC__ - это макрос, раскрывающийся в имя функции во время препроцессирования, то есть в строковый литерал. Вычисления же constexpr выражений идут на стадии компиляции, то есть после препроцессирования. Всё должно работать, в чём же проблема?
smertigdon
WPMGPRoSToTeMa
smertigdon, __func__ это статическая переменная определённая в каждой функции.
en.cppreference.com/w/cpp/language/function#func
WPMGPRoSToTeMa
smertigdon
WPMGPRoSToTeMa, не знал. Век живи, век учись. Пока не приняли proposal, можно и __FUNC__ пользоваться.
smertigdon
Andrey Davydov
__func__ является constexpr (static const для этого достаточно). Следующий код благополучно скомпилируется.

#include <iterator>

void foo()
{
static_assert(std::size(__func__) == 4);
}
Andrey Davydov
WPMGPRoSToTeMa
Andrey Davydov, нет, недостаточно. godbolt.org/g/Sg9U3i
WPMGPRoSToTeMa
smertigdon
Andrey Davydov, std::size прокатит с любыми массивами, так что не аргумент :)
smertigdon
Andrey Davydov
WPMGPRoSToTeMa, действительно, я был не прав. Интересно, что gcc выдает ошибки во 2-м и 4-м случае, а Clang и MSVC только во 2-м, т.е., они уже определяют __func__ как constexpr.
Andrey Davydov
yndx-antoshkka
Andrey Davydov, вот тут сделана работа с __func__ подобными макросами на этапе компиляции портабельно (но страшно) github.com/boostorg/type_index/blob/develop/include/boost/type_index/detail/compile_time_type_info.hpp

А вообще стоит поисследовать вопрос, разобраться - ошибка это GCC или правильное поведение, и если необходимо - написать proposal. Если готовы заняться - всячески помогу.
yndx-antoshkka
yndx-antoshkka
Насколько я понял из стандарта С++, "static const auto a = constant_expression" должно порождать переменную, которую можно использовать в constexpr.

Завёл два тикета, посмотрим что скажут разработчики компиляторов:
* gcc.gnu.org/bugzilla/show_bug.cgi?id=81911
* bugs.llvm.org/show_bug.cgi?id=34253
yndx-antoshkka
Дмитрий Назаров
У GCC была похожая ситуация с __PRETTY_FUNCTION__. Скажем в GCC 4.7 его нельзя было использовать в contexpr функциях. В то же время уже в GCC 4.8 вполне себе применим. Вообще говоря неплохо бы в стандарт внести ее аналог, так как __FUNC__ не учитывает в имени функции ее пространство имен, в то время как __PRETTY_FUNCTION__ - да.
Дмитрий Назаров
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).