将'const type'作为'this'参数传递给std :: remove_if会丢弃linux上的限定符

时间:2017-10-20 12:54:46

标签: c++ linux windows std

由于我昨天的post在这里再次投票,只有最小的例子和我的问题。

#include <set>
#include <algorithm>
using namespace std;

class dummy
{
public:
  dummy(int x)
      : test(x)
  {}

  bool operator()(const int &a) const
  {
    return false;
  }

protected:
  int test;
};


void foo()
{

  // Determine the bounding box.
  multiset<float> test;
  test.insert(3.5);
  multiset<float>::iterator itVertex = test.begin();


  multiset<int> workset;
  workset.insert(3);

  for (itVertex = test.begin(); itVertex != test.end(); itVertex++)
  {
    multiset<int>::iterator itEnd = remove_if(workset.begin(), workset.end(), dummy(3));

  }
}

我在两台机器上测试了这个例子:在Linux(Ubuntu 16.04,g ++ 5和6)上,我得到了前面描述的错误:

  

/ usr / include / c ++ / 5 / bits / stl_algo.h:868:23:错误:分配只读位置'__result.std :: _ Rb_tree_const_iterator&lt; _Tp&gt; :: operator *()'                 __ result = _GLIBCXX_MOVE( __ first);

在Windows 7 Visual Studio 2008上,它编译得很好。

我还查看了重复项,但他们未能描述 Windows 工作 的情况 Linux

那为什么它在Windows上编译好呢?为什么不在Linux上?我理解如何解决问题本身,但由于这是外部代码,如果没有必要,我不想编辑代码本身。

1 个答案:

答案 0 :(得分:1)

cursor.rowcount无法使用多重播放。它只适用于可以重新排序的容器,因为要移除的元素会暂时被其他元素覆盖,这些元素会填补空白。

使用std::remove_if,您无法覆盖给定迭代器的值,因为迭代器是已定义的排序函数和当前内容的乘积。

如果这适用于MSVC,那么该STL实现的功能超出了标准要求。不能安全地依赖它,因为它没有保证。