繁体   English   中英

类型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 ++中,一个临时对象称为rvalue (rvalue是一个历史术语,指的是通常在赋值运算符的右侧可以找到rvalue的事实(如a = get_b() )。 -您拥有右值。

非常量引用不能绑定到右值。 您可以使用const引用(这样可以延长临时文件的使用寿命),也可以创建新的std::string实例,然后在其中复制您的临时文件。 复制删除和移动语义将确保不会发生真正的复制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM