C не удается преобразовать входной параметр в ссылочный

#c

#c #c

Вопрос:

Ниже приведен простой пример, который приводит к ошибкам (ПО сравнению С 2019 годом):

  1. E0461 начальным значением ссылки на неконстантный параметр должно быть значение lvalue
  2. C2664 ‘void foo(std::string amp;)’: не удается преобразовать аргумент 1 из ‘std::string’ в ‘std::string amp;’

    использование пространства имен std;

     void foo(stringamp; input) {
        cout << "Foo is: " << input << endl;
    }
    
    string getInput() {
        return string("abc");
    }
    
    int main()
    {
        foo(getInput());
    }
      

Я не понимаю ошибку. GetInput() возвращает строку. Почему эта строка не может быть передана непосредственно функции foo () в качестве ссылки, точно так же, как любая локальная переменная или переменный элемент могут быть переданы по ссылке на функцию foo ()? Как следует из сообщения об ошибке, присвоение строковому аргументу значения const устраняет ошибку. С чего бы это?

Обновление: Я еще немного подумал над этим вопросом после рассмотрения ответа и пары ссылок, которые я разместил ниже. Я думаю, что основная проблема здесь заключается в том, что возвращаемое значение GetInput() является временной переменной. Если бы я вместо этого скопировал результат GetInput() в локальную или глобальную переменную, а затем передал это в foo(), ошибки бы не было. Я думаю, компилятору «не нравится» передавать временную переменную, которая хранит результат GetInput() по ссылке, потому что как долго временная переменная будет оставаться действительной? Очевидно, что он должен оставаться действительным сразу после возврата GetInput(), но сколько еще после этого?

Комментарии:

1. Измените void foo(stringamp; input) на void foo(const string amp;input) .

Ответ №1:

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

Комментарии:

1. Я думаю, вы правы. Ваш ответ имеет смысл, но мне нужно лучше понять значения rvalues и lvalues. Я нашел это: internalpointers.com/post / … и я просматриваю упомянутые источники (особенно первый источник). Я думаю, что смогу разобраться в этом, и, надеюсь, эта ссылка также поможет другим с подобными вопросами.

2. Еще одна полезная ссылка: cprogramming.com/c 11 /…