我收到一个错误:
错误:从'std::basic_string'类型的右值初始化'std::string& {aka std::basic_string&}'类型的非const引用无效
代码是:
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 回答
这些字符串中的任何一个都不应该是引用 . 它们是纯粹而简单的物体 . 删除两个
&
.您每次都在循环中创建一个新字符串,因此创建对它的引用意味着您正在尝试创建对r值的引用,由于它没有地址(直到它被分配),因此无法引用该值 .
从作业中的声明类型中删除
&
它应该可以使用,或者将其更改为const std::string&
,因为编译器通常允许将临时指定为引用,只要它们是常量即可 .当你有
hitVarNameConst + Format::toString(i + 1)
之类的东西时,你会得到一个临时对象 . 用C表示的临时对象称为rvalue(rvalue是一个历史术语,指的是通常在赋值运算符的右侧找到rvalues的事实(如a = get_b()
) . 在左侧你有一个右值 .非const引用不能绑定到rvalues . 你可以有一个const引用(它可以很好地延长临时的生命周期),或者你可以创建一个
std::string
的新实例并在那里复制你的临时 . 复制省略与移动语义一起将确保不会发生真正的复制 .