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

时间:2016-03-10 16:51:55

标签: c++ pointers compiler-errors const-pointer

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

代码是:

direction.z

如何删除此错误?之前我正在尝试以下代码,它仍然抛出相同的错误:

 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
      }

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这些字符串中的任何一个都不应该是引用。他们是对象,纯粹而简单。删除两个&

答案 2 :(得分:0)

当你有hitVarNameConst + Format::toString(i + 1)这样的东西时,你会得到一个临时对象。根据C ++,临时对象称为 rvalue (rvalue是一个历史术语,指的是通常在赋值运算符的右侧找到rvalues的事实(如{{1}在左侧你有一个右值。

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