首页 文章

std :: string类型的非const引用的无效初始化& - 如何删除

提问于
浏览
0

我收到一个错误:
错误:从'std::basic_string'类型的右值初始化'std::string& {aka std::basic_string&}'类型的非const引用无效

代码是:

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        
         }

3 回答

  • 1

    这些字符串中的任何一个都不应该是引用 . 它们是纯粹而简单的物体 . 删除两个 & .

  • 0

    您每次都在循环中创建一个新字符串,因此创建对它的引用意味着您正在尝试创建对r值的引用,由于它没有地址(直到它被分配),因此无法引用该值 .

    从作业中的声明类型中删除 & 它应该可以使用,或者将其更改为 const std::string& ,因为编译器通常允许将临时指定为引用,只要它们是常量即可 .

  • 1

    当你有 hitVarNameConst + Format::toString(i + 1) 之类的东西时,你会得到一个临时对象 . 用C表示的临时对象称为rvalue(rvalue是一个历史术语,指的是通常在赋值运算符的右侧找到rvalues的事实(如 a = get_b() ) . 在左侧你有一个右值 .

    非const引用不能绑定到rvalues . 你可以有一个const引用(它可以很好地延长临时的生命周期),或者你可以创建一个 std::string 的新实例并在那里复制你的临时 . 复制省略与移动语义一起将确保不会发生真正的复制 .

相关问题