![](/img/trans.png)
[英]invalid initialization of non-const reference of type ‘std::string&
[英]invalid initialization of non-const reference of type std::string& - how to remove
我收到一个错误:
错误:从类型'std :: basic_string'的右值初始化非常量引用'std :: string&{aka 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
}
您每次都在循环中创建一个新字符串,因此创建对它的引用意味着您试图创建对r值的引用,该值不能被引用,因为它没有地址(直到被分配)。
从您的分配的声明类型中删除&
,它应该可以工作,或者将其更改为const std::string&
,因为编译器通常允许将临时变量分配为引用,只要它们是常量即可。
这些字符串中的任何一个都不应该作为参考。 它们是对象,纯净而简单。 删除两个&
。
当您拥有hitVarNameConst + Format::toString(i + 1)
您会得到一个临时对象。 在C ++中,一个临时对象称为rvalue (rvalue是一个历史术语,指的是通常在赋值运算符的右侧可以找到rvalue的事实(如a = get_b()
)。 -您拥有右值。
非常量引用不能绑定到右值。 您可以使用const引用(这样可以延长临时文件的使用寿命),也可以创建新的std::string
实例,然后在其中复制您的临时文件。 复制删除和移动语义将确保不会发生真正的复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.