Open apolukhin opened 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
Нужно писать proposal https://wg21.link/cwg2362
Перенос предложения: голоса +15, -1 Автор идеи: WPMGPRoSToTeMa
В текущем виде func нельзя использовать в constexpr выражениях.
Имя функции известно во время компиляции, так что логично, чтобы его можно было использовать в constexpr выражениях.