cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить constexpr к __func__ #220

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +15, -1 Автор идеи: WPMGPRoSToTeMa

В текущем виде func нельзя использовать в constexpr выражениях.

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

apolukhin commented 3 years ago

smertigdon, 18 августа 2017, 18:08 Кхм.. FUNC - это макрос, раскрывающийся в имя функции во время препроцессирования, то есть в строковый литерал. Вычисления же constexpr выражений идут на стадии компиляции, то есть после препроцессирования. Всё должно работать, в чём же проблема?

WPMGPRoSToTeMa, 18 августа 2017, 18:28 smertigdon, func это статическая переменная определённая в каждой функции. http://en.cppreference.com/w/cpp/language/function#func

smertigdon, 18 августа 2017, 20:32 WPMGPRoSToTeMa, не знал. Век живи, век учись. Пока не приняли proposal, можно и FUNC пользоваться.

Andrey Davydov, 18 августа 2017, 20:02 func является constexpr (static const для этого достаточно). Следующий код благополучно скомпилируется.

#include <iterator>

void foo()
{
    static_assert(std::size(__func__) == 4);
}

WPMGPRoSToTeMa, 18 августа 2017, 20:29 Andrey Davydov, нет, недостаточно. https://godbolt.org/g/Sg9U3i

smertigdon, 18 августа 2017, 20:31 Andrey Davydov, std::size прокатит с любыми массивами, так что не аргумент :)

Andrey Davydov, 18 августа 2017, 20:42 WPMGPRoSToTeMa, действительно, я был не прав. Интересно, что gcc выдает ошибки во 2-м и 4-м случае, а Clang и MSVC только во 2-м, т.е., они уже определяют func как constexpr.

yndx-antoshkka, 19 августа 2017, 19:57 Andrey Davydov, вот тут сделана работа с func подобными макросами на этапе компиляции портабельно (но страшно) https://github.com/boostorg/type_index/blob/develop/include/boost/type_index/detail/compile_time_type_info.hpp

А вообще стоит поисследовать вопрос, разобраться - ошибка это GCC или правильное поведение, и если необходимо - написать proposal. Если готовы заняться - всячески помогу.

yndx-antoshkka, 21 августа 2017, 12:53 Насколько я понял из стандарта С++, "static const auto a = constant_expression" должно порождать переменную, которую можно использовать в constexpr.

Завёл два тикета, посмотрим что скажут разработчики компиляторов:

Дмитрий Назаров, 6 октября 2017, 19:21 У GCC была похожая ситуация с PRETTY_FUNCTION. Скажем в GCC 4.7 его нельзя было использовать в contexpr функциях. В то же время уже в GCC 4.8 вполне себе применим. Вообще говоря неплохо бы в стандарт внести ее аналог, так как FUNC не учитывает в имени функции ее пространство имен, в то время как PRETTY_FUNCTION - да.

yndx-antoshkka, 9 октября 2018, 15:24 Обновили список проблем в ядре языка. Теперь там есть и бага из этого предложения: func should be constexpr

apolukhin commented 3 years ago

Нужно писать proposal https://wg21.link/cwg2362