функция constexpr возвращает строковый литерал

функция, возвращающая копию целочисленного литерала

int number()
{ return 1; }

можно легко преобразовать в простое выражение времени компиляции с помощью ключевого слова constexpr.

constexpr int number()
{ return 1; }

однако я путаюсь, когда дело доходит до строковых литералов. Обычный метод возвращает указатель на const char, что указывает на строковый литерал,

const char* hello()
{ return "hello world"; }

но я думаю, что просто изменение "const" на constexpr не то, что я хочу (в качестве бонуса, он также производит компилятор предупреждение устаревшее преобразование из Строковой константы в'char*' использование gcc 4.7.1)

constexpr char* hello()
{ return "hello world"; }

есть ли способ реализации hello() таким образом, что вызов заменяется константным выражением, в приведенном ниже примере?

int main()
{
    std::cout << hello() << "n";
    return 0;
}

2 ответов


const и constexpr are не заменимый в вашем случае вы не хотите уронить const но вы хотите добавить constexpr вот так:

constexpr const char* hello()
{
  return "hello world";
}

предупреждение появляется при удалении const, потому что строковый литерал это array of n const char и поэтому указатель на строковый литерал должен быть * const char**, но в C a строковый литерал является массивом char, хотя это неопределенное поведение чтобы попытаться изменить их, он был сохранен для обратной совместимости, но обесценивается, поэтому его следует избегать.


оценка силы constexpr:

constexpr const char * hi = hello();
std::cout << hi << std::endl;