当前位置: 首页 > 知识库问答 >
问题:

Std::Vector::与Std::Exchange的引用

赏航
2023-03-14
struct Manager
{
  std::vector<bool> lifeTimes;

  //Should return the state before trying to kill it
  bool kill(std::size_t index)
  {
    return std::exchange(lifeTimes[index], false);
  }
};

错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue

因此,它抱怨false,因为只有第二个参数是rvalue

共有1个答案

周龙光
2023-03-14

它不是一个bug,MSVC编译代码是因为它有一个扩展,可以将临时对象(Rvalue)绑定到非常量的Lvalue引用。

下面的代码用MSVC编译:

void foo(int& i) {}
foo(20); // you are passing Rvalue and it is bound to Lvalue reference

上面的代码不能在g++或CLang下编译,当您添加const以引用const Lvalue时,它可以工作:

void foo(const int&){}
foo(20); // you can bind Rvalue to const Lvalue reference
T& vector<T>::operator[](index) // where T is not bool
vector<bool>::reference vector<bool>::operator[](index)
              ^^^^^^^^^  
return std::exchange(lifeTimes[index], false);
  bool kill(std::size_t index)
  {
      std::vector<bool>::reference proxyForBit = lifeTimes[index];
    return std::exchange(proxyForBit, false);
  }
 类似资料:
  • 下面的代码显示了我要做的:

  • 我在std::sort中发现了一个bug,特别是在一些QuickSort的实现中,我不知道问题是否出在一般的算法中。 精华: 当元素小于16时,所有的规范都被替换,因为std::sort使用插入排序。 当有17个或更多的元素时,使用快速排序,并从元素数量的对数限制递归深度,但向量在第一次__introsort_loop迭代时有时间恶化。 当有许多相同的元素时,就会出现向量损坏。用无效迭代器替换有效

  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 我以前见过这样做,但我不记得如何有效地初始化已知长度的与长度相同的。这里有一个很好的例子: 我已经仔细阅读了这一页关于高级矩阵初始化的内容,但是没有明确解释执行此操作的方法。

  • 我正在用Qt编写一个图像查看器。我试图在头文件中执行以下操作: 在源文件中: 然而,我得到了以下错误: 在非类类型int[10]的缩放中请求成员开始,在非类类型int[10]的缩放中请求成员结束 有人知道如何初始化这个静态const private成员吗?