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
}
您每次都在循环中创建一个新字符串,因此创建对它的引用意味着您正在尝试创建对右值的引用,由于它没有地址(直到它是已分配)。
从赋值中的声明类型中删除 &
它应该可以工作,或者将其更改为 const std::string&
,因为编译器通常允许将临时对象分配为引用,只要它们是常量.
当你有类似 hitVarNameConst + Format::toString(i + 1)
的东西时,你会从中得到一个临时对象。就 C++ 而言,临时对象称为 rvalue(右值是一个历史术语,指的是通常右值位于赋值运算符的右侧(如a = get_b()
). 在左边你有一个右值。
非常量引用不能绑定到右值。您可以有一个 const 引用(这对延长临时文件的生命周期有很好的效果),或者您可以创建一个 std::string
的新实例并将您的临时文件复制到那里。复制省略和移动语义将确保不会发生真正的复制。
这些字符串都不应该是参考。它们是对象,纯粹而简单。删除两个 &
s.
我遇到一个错误:
错误:从 '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
}
您每次都在循环中创建一个新字符串,因此创建对它的引用意味着您正在尝试创建对右值的引用,由于它没有地址(直到它是已分配)。
从赋值中的声明类型中删除 &
它应该可以工作,或者将其更改为 const std::string&
,因为编译器通常允许将临时对象分配为引用,只要它们是常量.
当你有类似 hitVarNameConst + Format::toString(i + 1)
的东西时,你会从中得到一个临时对象。就 C++ 而言,临时对象称为 rvalue(右值是一个历史术语,指的是通常右值位于赋值运算符的右侧(如a = get_b()
). 在左边你有一个右值。
非常量引用不能绑定到右值。您可以有一个 const 引用(这对延长临时文件的生命周期有很好的效果),或者您可以创建一个 std::string
的新实例并将您的临时文件复制到那里。复制省略和移动语义将确保不会发生真正的复制。
这些字符串都不应该是参考。它们是对象,纯粹而简单。删除两个 &
s.