Я получаю ошибку:
ошибка: неверная инициализация неконстантной ссылки типа ‘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
}
Ни одна из этих строк не должна быть ссылкой. Они объекты, чистые и простые. Удалить два &
s.
Вы каждый раз создаете новую строку в цикле, поэтому создание ссылки на нее означает, что вы пытаетесь создать ссылку на r-значение, на которое нельзя ссылаться, поскольку у него нет адреса (пока он не назначен).
Удалить &
из типа объявления в вашем назначении, и он должен работать, или изменить его на const std::string&
, поскольку компиляторы часто разрешают назначать временные ссылки в качестве ссылок, если они постоянны.
Когда у вас есть что-то вроде hitVarNameConst + Format::toString(i + 1)
Вы получаете временный объект из этого. Временный объект в терминах C ++ называется Rvalue (rvalue — это исторический термин, относящийся к тому факту, что обычно r-значения находятся в правой части оператора присваивания (как в a = get_b()
). На левой стороне у вас есть значение.
Неконстантные ссылки не могут быть привязаны к значениям. Вы можете либо иметь ссылку на const (которая будет иметь хороший эффект продления времени жизни временного), либо вы можете создать новый экземпляр std::string
и скопируйте ваш временный там. Копирование с семантикой перемещения гарантирует, что никакого реального копирования не будет.