C ++ указатель на функцию со ссылочным типом возврата - PullRequest
0 голосов
/ 29 июня 2018

Я хочу записать указатель на функцию со ссылочным типом возврата

string & cmp(string &s1, string &s2) {
    return s1.size() > s2.size() ? s1 : s2;
}

Функция cmp проста, она просто возвращает более длинную строку.

string string1 = "123";
string string2 = "1234";

string & (*pf)(string &,string &) = cmp;

нормально звонить

string &temp = cmp(string1, string2);

но когда я пытаюсь использовать pf,

string &temp = pf(string1, string2);

Компилятор показывает ошибку: expression must be lvalue

добавлено: извините, похоже, IDE предоставляет неверную информацию о проверке.

enter image description here

Я использую CLion в качестве IDE. Красное подчеркивание показывает ошибку, но на самом деле я могу скомпилировать его и запустить успешно .... Это странно, кто-нибудь знает, что не так с моей проверкой IDE? Или, может быть, мне нужно опубликовать вопрос в сообществе CLion?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Я попробовал, все, что вам нужно сделать, это удалить & из переменной в основной функции:

string& (*pf)(string &,string &) = cmp;
string temp = pf(string1, string2);

Но я попробовал что-то еще, что тоже сработало:

string& (*pf)(string &,string &) = cmp;
string &temp = cmp(string1, string2);
temp = pf(string1, string2);
temp = test(string1, string2);
0 голосов
/ 29 июня 2018

Я думаю, что CLion только что рассматривал вызов функции как значение по умолчанию (хотя он и возвращает ссылку на lvalue). Однако никогда не использует указатели функций в C ++ , std :: function здесь, чтобы избежать беспорядочного синтаксиса указателей на функции C, или вы можете просто написать

auto pf = cmp;

или

auto& pf = cmp;

Не уверен, какой из них рекомендуется, но я предполагаю, что auto&, поскольку cmp является значением.

...