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