c – 显式拷贝构造函数和std :: sort

前端之家收集整理的这篇文章主要介绍了c – 显式拷贝构造函数和std :: sort前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当对具有显式拷贝ctor的对象进行排序时,我得到编译器错误(来自g 4.8.2和clang 3.4,都在-std = c 11模式下),我不明白.我创建了一个简单的例子来说明问题
class A {
public:
  explicit A(int i): m_i(i) {};
  explicit A(const A& other): m_i(other.m_i) {};
  int i() const {return m_i;};
private:
  int m_i;
};

bool is_less(const A& a,const A& b) {
  return a.i() < b.i();
}

int main(int,char*[]) {
  std::vector<A> objects;
  objects.push_back(A(3));
  objects.push_back(A(5));
  objects.push_back(A(-1));

  std::cout << is_less(objects[1],objects[2]);
  std::sort(objects.begin(),objects.end(),is_less);

  for (auto& a: objects) {
    std::cout << a.i() << " ";
  }
  std::cout << std::endl;
}

这失败了

error: 
  no matching constructor for initialization of '_ValueType' (aka 'A')

cl ang.

error: no matching function for call to ‘A::A(std::remove_reference<A&>::type)

在g.如果复制构造函数不是显式的,代码编译并工作正常(但我想强制,只有对我的对象的引用可以用作参数和返回值).在删除对std :: sort(所以is_less(objects [1],objects [2])不是问题的调用后,代码也会编译).因此,我的问题是什么std :: sort在调用比较函数,编译这个代码失败,以及如何解决它.

经过大量的研究,接近我问题的唯一问题就是In copy-initialization,is the call to the copy constructor explicit or implicit?,它链接到gcc中的一个bug.但是,cl ang表现出相同的行为,所以我真的很想了解发生了什么.

解决方法

std :: sort要求元素类型为MoveConstructible.

MoveConstructible的要求表示T u = rv;必须有效.但是,此表达式执行副本初始化,并要求存在非显式的复制或移动构造函数.

在这种情况下,copy构造函数是显式的,并声明它意味着没有隐式声明的move构造函数.因此,表达式无效,A类不是MoveConstructible.

猜你在找的C&C++相关文章