вызов функции basic_string в функции constexpr - PullRequest
0 голосов
/ 24 января 2020

Я не нашел ничего о функции constexpr. Праймер C ++ говорит, что тип возвращаемого значения и тип каждого параметра в a должен быть литеральным типом. А теперь возвращаемый тип я использую bool и тип параметров я использую reference.but в возвращении я использую две функции basic_string для результатов расчета. Clion говорит мне, что я не могу использовать функцию basic_string в функции constexpr

constexpr bool a (const string &z , const string &zz)
{
    return (z.size() > zz.size());
}

Спасибо Вы очень за то, что ответили на мой вопрос

Ответы [ 2 ]

1 голос
/ 24 января 2020

Вы правы, что все используемые вами типы являются литеральными типами , но есть еще одно требование для функции constexpr.

Функция constexpr должна вызываться при хотя бы один набор аргументов, чтобы вызов был константным выражением.

Проблема в том, что z.size() никогда нельзя вызывать в константном выражении, потому что string 'size функция не объявлена ​​constexpr.

Если объявленная функция constexpr никогда не может использоваться в качестве константного выражения, то программа имеет неопределенное поведение , и компилятор может или не может предупредить или напечатать ошибку о it.

Если вы измените функцию так, чтобы ее можно было использовать в качестве константного выражения хотя бы для одного набора аргументов вызова, то в определении больше не будет ошибки:

constexpr bool a (bool b, const string &z , const string &zz)
{
    return b ? false : (z.size() > zz.size());
}

Вы все еще не можете вызывать это как часть постоянного выражения с b как false.


Как уже упоминалось в комментариях, вы можете заставить эту функцию работать (предполагая, что это вызов редактирование с аргументами, которые можно использовать в постоянном выражении) с использованием string_view вместо const string& начиная с C ++ 17. (Требуется #include<string_view>). Это работает, потому что std::string_view является литеральным типом (в частности, он имеет constexpr конструкторы), и его size функция также равна constexpr.

0 голосов
/ 24 января 2020

Я думаю, что главный ответ в этой ветке также может быть очень полезен при ответе на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...