代码之家  ›  专栏  ›  技术社区  ›  Ayak973

强制编译器在未使用基类删除的复制构造函数定义的移动构造函数上发出错误

  •  0
  • Ayak973  · 技术社区  · 6 年前

    考虑一个基类,防止复制构造和复制分配这样:

    class NonCopyable {
        public:
            NonCopyable() = default;
            ~NonCopyable() = default;
    
            NonCopyable(NonCopyable const&)                 = delete;
            NonCopyable& operator=(NonCopyable const&)      = delete;
    };
    

    我们的开发人员现在可以包含此类,并使用它禁用继承类的复制,如下所示:

    class CopyTest : public NonCopyable {
        public:
            CopyTest() {
                std::cout << "copy test created" << std::endl;
            }
    
            ~CopyTest() {
                std::cout << "copy test deleted" << std::endl;
            }
    };
    

    当我尝试使用 CopyTest 类别:

    CopyTest ct, ct1(ct);
    

    CopyTest ct;
    CopyTest ct1 = ct2;
    

    use of deleted function xxx (其中xxx是我的已删除复制操作员或复制操作员)

    std::move 文案 对象:

    CopyTest ct;
    CopyTest ct1 = std::move(ct);
    

    编译器发出相同的错误(使用已删除的函数xxx-其中xxx仍然是我的复制运算符或赋值运算符)。

    如果我没记错的话,那是因为开发人员没有定义正确的move-ctor/assignment操作符。

    有没有可能强制编译器告诉开发人员 文案

    站台:

    Debian 9

    编译标志:

    -fppermissive-ggdb-std=c++11

    2 回复  |  直到 6 年前
        1
  •  2
  •   Yakk - Adam Nevraumont    6 年前

    添加

        NonCopyable(NonCopyable &&)                 = delete;
        NonCopyable& operator=(NonCopyable &&)      = delete;
    

        2
  •  0
  •   Julien Villemure-Fréchette    6 年前

    从形式上讲,隐式生成的move-ctor/assignment在基类中定义为“deleted” NonCopyable 它本身重载解析只会忽略“已删除”移动/赋值(而不是严格意义上的删除)。自从 不可复制且不可移动,任何子类的隐式(and=默认)复制和移动操作都将定义为已删除。

    在严格的ISO C++中,您的设计具有所需的语义,但不幸的是,大多数编译器不严格执行所谓的语义。 五常 隐式删除

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58407#c16 . 这表明编译器可能会开始强制执行或警告 五常