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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |