Почему параметр не является константным выражением? - PullRequest
0 голосов
/ 29 января 2019

Не могли бы вы объяснить, почему этот код не компилируется?

// source.cpp
constexpr const char* func(const char* s) { return s;}

constexpr bool find(const char *param) {
   constexpr const char* result = func(param);
   return (param == 0);
}

int main()
{
   constexpr bool result = find("abcde");
}

Команда компиляции:

$ g++ -std=c++14 source.cpp

Я пробовал gcc5.4 и gcc6.4.Ошибка:

source.cpp: In function ‘constexpr bool find(const char*)’:
source.cpp:5:46: error: ‘param’ is not a constant expression
 constexpr const char* result = func(param);
                                          ^

1 Ответ

0 голосов
/ 29 января 2019

Параметр функции никогда не является константным выражением.Помните, что функции constexpr похожи на обычные функции.Они также могут быть вызваны во время выполнения.Поэтому мы не можем предполагать, что адрес, переданный в param, является чем-то, что является константным выражением, и поэтому не можем использовать его для инициализации переменной constexpr или возвращаемого значения.

Вы можете передать строковые литералы функциям constexpr и выдать constexpr результатов, , например :

constexpr bool find(const char *param) {
   return (param[0] == 0);
}

int main()
{
   constexpr bool result = find("abcde"); // OK!
}

Функция вызывается в константном выражении, если задано константное выражение.Но он не может предполагать, что его когда-либо называют только постоянным выражением (я знаю, можно подумать об этом косоглазым).

...