неверная инициализация неконстантной ссылки типа std :: string & amp; — как убрать

Я получаю ошибку:
ошибка: неверная инициализация неконстантной ссылки типа ‘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
}

0

Решение

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

1

Другие решения

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

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

1

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

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

0
По вопросам рекламы [email protected]