类型为 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++而言,临时对象称为右值(右值是一个历史术语,指的是通常在赋值运算符的右侧找到右值的事实(如a = get_b()
)。在左侧,您有一个右值。
非常量引用不能绑定到右值。你可以有一个 const 引用(这将有一个很好的效果来延长临时的生存期),或者你可以创建一个新的 std::string
实例并在那里复制你的临时。复制省略与移动语义一起将确保不会发生真正的复制。
相关文章:
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 在加载 MSHTML 文档之前从 MSHTML 文档中删除无效的 URL
- 删除无效地址时C++引发异常
- 无效删除运算符语法
- 擦除删除成语的性能增益从何而来
- 在循环内删除文件时使提升recursive_directory_iterator无效
- 结构sqlite3的sqlite3c++正向声明导致析构函数中删除时出现无效指针错误
- 删除指向类的指针无效
- 为什么删除指向指针向量的指针会导致指针无效
- 模板化的出列无效指针:删除类时失败
- 删除指向派生类的指针时,为RtlValidateHeap指定的地址无效
- 为什么Boost图库在删除顶点时会使所有迭代器无效
- 类型为 std::String&- 的非常量引用的初始化无效 - 如何删除
- C++ 瓦尔格林德无效删除动态数组
- 删除与运算符删除(和无效指针)
- 瓦尔格林德报告无效免费/删除/ realloc
- 删除文件的内容无效
- 删除时指针崩溃无效,但指针不同
- 删除[]指针数组无效
- 使用zLib删除无效