Константы constexpr внутри функции constexpr?
Предположим, у меня есть статическая функция, которая принимает перечисление и возвращает указатель cstring для отладки.
Функция может быть constexpr, но не гарантируется, что ее всегда можно будет вычислить во время компиляции. Скажем, он работает на микроконтроллере, и это сигнализирует о событиях из стека Bluetooth; например, устройство подключено, отключено, данные получены и т. д. для контекста. Таким образом, параметр не обязательно известен во время компиляции.
Есть ли какая-либо ценность, смысл или разница в том, что cstrings также определены как constexpr или нет?
Сжатый пример того, что я имею в виду:
#include <cstdio>
enum myEnum
{
EVENT1,
EVENT2,
EVENT3
};
static constexpr const char* foo(const myEnum i)
{
// Does having these as constexpr change anything?
/*constexpr*/ const char* text1 = "Text1";
/*constexpr*/ const char* text2 = "Text2";
/*constexpr*/ const char* text3 = "Text3";
/*constexpr*/ const char* textUndef = "TextUndef";
switch (i)
{
case EVENT1:
return text1;
case EVENT2:
return text2;
case EVENT3:
return text3;
default:
return textUndef;
}
}
int main()
{
const char* x = foo(EVENT1);
const char* y = foo(/*some value only known at runtime*/);
printf(x);
printf(y);
return 1;
}
Я компилирую с gcc для cpp17 для встроенного микроконтроллера. Обычно либо с -Og, либо с -Os.
1 ответ
Объявление переменных const char* constexpr в foo() не добавляет никакой ценности, потому что вы не используете их constexpr-ность внутри функции.
В main вы можете объявить x как constexpr, чтобы быть уверенным, что значение x присваивается во время компиляции. Это может быть полезно, поскольку вызов функции constexpr (даже при передаче литеральных значений) не гарантирует, что она будет вычислена во время компиляции. Однако есть одна загвоздка: вы больше не сможете изменять указатель (x станет const char *const, то есть константным указателем на const char).
y всегда оценивается во время выполнения, поэтому вы не можете объявить его constexpr.
Я предлагаю попробовать свои фрагменты на godbolt.org, чтобы увидеть результаты с различными вариантами оптимизации.