функция 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, хотя это неопределенное поведение чтобы попытаться изменить их, он был сохранен для обратной совместимости, но обесценивается, поэтому его следует избегать.