类型为 std::String&- 的非常量引用的初始化无效 - 如何删除

invalid initialization of non-const reference of type std::string& - how to remove

本文关键字:何删除 无效 删除 初始化 常量 std String 类型 非常 引用      更新时间:2023-10-16

我收到错误:
错误:从类型为"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 实例并在那里复制你的临时。复制省略与移动语义一起将确保不会发生真正的复制。