当前位置:  开发笔记 > 编程语言 > 正文

如何将std :: sort与没有复制构造函数的对象一起使用?

如何解决《如何将std::sort与没有复制构造函数的对象一起使用?》经验,为你挑选了1个好方法。

我正在尝试对包含不可复制或默认可构造的对象的向量进行排序(但是可移动构造),但是我得到了有关编译器无法找到有效函数的错误swap.我认为拥有一个移动构造函数就足够了.我在这里错过了什么?

class MyType {
public:
    MyType(bool a) {}
    MyType(const MyType& that) = delete;
    MyType(MyType&& that) = default;
};

int main(void) {
    vector v;
    v.emplace_back(true);
    sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) {
        return true;
    });
}

vsoftco.. 21

您需要明确定义移动赋值运算符,因为这std::sort也是尝试(不仅仅是移动构造).需要注意的是此举赋值运算符的编译器生成禁止由用户提供的拷贝构造函数的存在,以及由用户提供的移动构造函数(即使它们的存在delete-ed).例:

#include 
#include 

class MyType {
public:
    MyType(bool a) {}
    MyType(const MyType& that) = delete;
    MyType(MyType&& that) = default;
    MyType& operator=(MyType&&) = default; // need this, adapt to your own need
};

int main(void) {
    std::vector v;
    v.emplace_back(true);
    std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) {
        return true;
    });
}

Live on Coliru

该滑动通过霍华德Hinnant(欣南特)(的主要贡献者在C++ 11移动语义)是超级有用,以及第17项:理解特殊成员函数生成从有效的现代C++斯科特迈尔斯.



1> vsoftco..:

您需要明确定义移动赋值运算符,因为这std::sort也是尝试(不仅仅是移动构造).需要注意的是此举赋值运算符的编译器生成禁止由用户提供的拷贝构造函数的存在,以及由用户提供的移动构造函数(即使它们的存在delete-ed).例:

#include 
#include 

class MyType {
public:
    MyType(bool a) {}
    MyType(const MyType& that) = delete;
    MyType(MyType&& that) = default;
    MyType& operator=(MyType&&) = default; // need this, adapt to your own need
};

int main(void) {
    std::vector v;
    v.emplace_back(true);
    std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) {
        return true;
    });
}

Live on Coliru

该滑动通过霍华德Hinnant(欣南特)(的主要贡献者在C++ 11移动语义)是超级有用,以及第17项:理解特殊成员函数生成从有效的现代C++斯科特迈尔斯.


根据cppreference,`std :: sort`要求类型移动可构造*和*移动可分配.
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有