Неверная инициализация неконстантной ссылки типа 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
и скопируйте ваш временный там. Копирование с семантикой перемещения гарантирует, что никакого реального копирования не будет.