GCC C ++ 11删除移动可分配类的副本分配会阻止std :: sort编译?

用户名

我正在尝试对实现移动分配运算符的类的向量进行排序。该代码在Microsoft和Intel C ++中可以正常工作。在GCC 4.8.1中,复制构造函数被删除,似乎引起问题。

c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:2164:11: error: use of deleted function 'constexpr MoveOnly::MoveOnly(const MoveOnly&)'
__val = _GLIBCXX_MOVE(*__i);
        ^
test.cpp:6:11: note: 'constexpr MoveOnly::MoveOnly(const MoveOnly&)' is implicitly declared as deleted because 'MoveOnly' declares a move constructor or move assignment operator

在Matthieu M.的帮助下,此页面说明了为什么删除复制构造函数。

#include <vector>
#include <algorithm>
#include <iostream>
#include <type_traits>

class MoveOnly {

public:
    int data;
    MoveOnly& operator = (const MoveOnly && rhs) {
        data = rhs.data;
        return *this;
    }
    MoveOnly& operator = (const MoveOnly & rhs) {
        data = rhs.data;
        return *this;
    }
    bool operator < (const MoveOnly& j) const {
        return data<j.data;
    }
};

int main() {

    std::cout<<"Is move_assignable:"<<std::is_move_assignable<MoveOnly>::value<<std::endl;
    std::cout<<"Is copy_assignable:"<<std::is_copy_assignable<MoveOnly>::value<<std::endl;
    std::vector<MoveOnly> vMoveOnly;
    //std::sort(vMoveOnly.begin(), vMoveOnly.end());
    return 0;
}
马苏德

声明移动构造函数或移动赋值运算符会删除默认的复制/移动构造函数(IMO,因为鼓励我们遵守五个规则!),另一方面,std::sort需要具有以下代码的move-construct或copy-construct之一:

    template<typename _RandomAccessIterator>
    void
    __insertion_sort(_RandomAccessIterator __first,
             _RandomAccessIterator __last)
    {
      if (__first == __last)
    return;

    for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
    {
      if (*__i < *__first)
        {
          typename iterator_traits<_RandomAccessIterator>::value_type
        __val = _GLIBCXX_MOVE(*__i);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

解决问题:

您需要一个可移动构造的类,并且可以通过测试它is_move_constructiblestd::sort需要第一个。放置一个移动构造函数以使其可移动构造。

您至少需要移动分配或复制分配之一来进行分配,并且至少需要复制构造器或移动构造器之一来进行构造。

当您的班级名称为时MoveOnly,我认为选择移动分配和移动构造器是合理的。因此,此代码足以编译:

class MoveOnly {

    ...

    MoveOnly(MoveOnly &&m) : data(m.data) {}

    MoveOnly& operator = (const MoveOnly && rhs) { ... }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么会导致 gcc 部分编译 C 代码?

来自分类Dev

无法使用GCC 5.1工具链编译C ++ 11源

来自分类Dev

在 docker gcc:5 镜像中编译 c++11

来自分类Dev

用gcc编译多个C文件

来自分类Dev

C ++ / GCC-为什么要编译

来自分类Dev

用gcc编译多个C文件

来自分类Dev

需要帮助使用gcc编译C程序

来自分类Dev

努力编译简单的C程序(gcc)

来自分类Dev

gcc编译选项std = c ++ 1y和std = c ++ 14之间的区别

来自分类Dev

如何使用gcc 4.4.7编译具有C ++ 11功能的C ++代码

来自分类Dev

编译相当简单的c ++ 11程序时gcc和clang之间的结果不同

来自分类Dev

编译相当简单的c ++ 11程序时,gcc和clang之间的结果不同

来自分类Dev

PGI 14.6 OpenSuse 13.1 x_64 gcc 4.8 c ++ 11编译错误

来自分类Dev

std :: find()无法使用gcc进行编译

来自分类Dev

GCC ARM C编译器不支持%llx printf格式代码的-std = c99

来自分类Dev

gcc编译器未连续分配内存

来自分类常见问题

C内核编译:GCC LD未定义对___main的引用

来自分类Dev

编译c时使用cygwin“ -bash:gcc:命令未找到”?

来自分类Dev

gcc使用.s文件编译.c-.bss混淆(错误?)

来自分类Dev

Linux C ++库包含不同的GCC编译版本

来自分类Dev

Python / Pip C包PyProj无法使用GCC编译

来自分类Dev

在GCC编译器上使用C查找因素

来自分类Dev

使用GCC(G ++)编译c ++ OpenACC并行CPU代码

来自分类Dev

C内核编译:GCC LD未定义对___main的引用

来自分类Dev

GCC编译的Hello World C ++的EXEC格式错误

来自分类Dev

尝试在Windows上编译GNUstep Objective-C的GCC错误

来自分类Dev

Python / C API gcc编译警告未使用的变量

来自分类Dev

Eclipse使用G ++而不是GCC编译C代码

来自分类Dev

安装GCC时使用C编译器!

Related 相关文章

热门标签

归档