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.