当对具有显式拷贝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表现出相同的行为,所以我真的很想了解发生了什么.