Неверная инициализация неконстантной ссылки типа std::string& - как удалить

Я получаю ошибку:
ошибка: неверная инициализация неконстантной ссылки типа 'std::string& {aka std::basic_string&}' из значения типа 'std::basic_string'

Код является:

 const std::string& hitVarNameConst = (isKO ? "isKO" : "isKI");
 for (int i = 0; i < numAssets; i++){
      std::string& hitVarName1 = hitVarNameConst + Format::toString(i + 1);
      //use hitVarname1 with some other function
      }

Как мне удалить эту ошибку? Ранее я пробовал следующий код, он по-прежнему выдавал ту же ошибку:

    for (int i = 0; i < numAssets; i++){
        std::string& hitVarName1 = (isKO ? "isKO" : "isKI") + Format::toString(i + 1);
         //use hitVarname1 with some other function        
         }

3 ответа

Решение

Ни одна из этих строк не должна быть ссылкой. Они объекты, чистые и простые. Удалить два &s.

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

Удалить & из типа объявления в вашем назначении, и он должен работать, или измените его на const std::string&, поскольку компиляторы часто разрешают назначать временные ссылки в качестве ссылок, если они постоянны.

Когда у вас есть что-то вроде hitVarNameConst + Format::toString(i + 1) Вы получаете временный объект из этого. Временный объект в терминах C++ называется rvalue (rvalue - это исторический термин, ссылающийся на тот факт, что обычно r-значения находятся в правой части оператора присваивания (как в a = get_b()). С левой стороны у вас есть значение.

Неконстантные ссылки не могут быть привязаны к значениям. Вы можете либо иметь ссылку на const (которая будет иметь хороший эффект продления времени жизни временного), либо вы можете создать новый экземпляр std::string и скопируйте ваш временный там. Копирование с семантикой перемещения гарантирует, что никакого реального копирования не будет.

Другие вопросы по тегам