相关疑难解决方法(0)

默认的虚拟析构函数是否会阻止编译器生成的移动操作?

灵感来自帖子为什么析构函数会禁用隐式移动方法的生成?,我想知道默认的虚拟析构函数是否也是如此,例如

class WidgetBase // Base class of all widgets
{
    public:
        virtual ~WidgetBase() = default;
        // ...
};
Run Code Online (Sandbox Code Playgroud)

由于该类旨在成为窗口小部件层次结构的基类,因此我必须定义其析构函数virtual,以避免在使用基类指针时出现内存泄漏和未定义的行为.另一方面,我不想阻止编译器自动生成移动操作.

默认的虚拟析构函数是否会阻止编译器生成的移动操作?

c++ move-semantics virtual-destructor c++11

30
推荐指数
1
解决办法
2715
查看次数

零与基类析构函数的规则

我有一个基类Base和一个派生类D,我想为我自动生成移动构造函数和移动赋值运算符.遵循Zero规则,我将所有内存管理留给编译器,只使用level-2类(没有原始指针,数组等):

#include <iostream>

class Base{
  public:
    Base(): a_(42) {}
    virtual void show() { std::cout << "Base " << a_ << std::endl; }

  private:
    int a_;
};

class D : Base {
  public:
    D(): b_(666) {}
    void show() { std::cout << "D " << b_ << std::endl; }

  private:
    int b_;
};

int main() {
  Base b;
  b.show();
  D d;
  d.show();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该是吧,对吗?

输入C++核心指南:

基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.

啊,所以我想我必须添加一个析构函数Base.但这将取消自动生成的移动功能!

什么是干净的出路?

c++ c++11 rule-of-zero

3
推荐指数
1
解决办法
336
查看次数

为什么插入用户定义的析构函数需要用户定义的复制构造函数

以下代码编译:

#include <vector>
#include <iostream>
#include <memory>

using namespace std;

class container
{
public:
    container(){}
    ~container(){}
};

class Ship
{
public:
    Ship(){}
    //Ship(const Ship & other){cout<<"COPY"<<endl;}
    //~Ship(){}

    std::unique_ptr<container> up;
};

Ship buildShip()
{
    Ship tmp;
    return tmp;
}

int main(int argc, char *argv[])
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们包含用户定义的析构函数~Ship(){},那么只有在我们还包含用户定义的复制构造函数时,代码才会编译Ship(const Ship & other){cout<<"COPY"<<endl;}

简而言之:

编译:

Ship(){}
//Ship(const Ship & other){cout<<"COPY"<<endl;}
//~Ship(){}
Run Code Online (Sandbox Code Playgroud)

编译:

Ship(){}
Ship(const Ship & other){cout<<"COPY"<<endl;}
~Ship(){}
Run Code Online (Sandbox Code Playgroud)

不编译:

Ship(){}
//Ship(const Ship & other){cout<<"COPY"<<endl;}
~Ship(){}
Run Code Online (Sandbox Code Playgroud)

为什么插入用户定义的析构函数需要用户定义的复制构造函数,为什么我们在上面的例子中需要一个复制构造函数呢?

我希望上面的例子中不需要复制构造函数,因为甚至无法复制unique_ptr.

c++ destructor copy-constructor unique-ptr c++11

3
推荐指数
1
解决办法
217
查看次数

C++中值语义和移动语义之间的联系是什么?

有很多文章讨论价值语义与参考语义,也许更多的文章试图解释移动语义.但是,没有人谈论过值语义和移动语义之间联系.它们是正交概念吗?

注意:这个问题不是关于比较值语义和移动语义,因为很明显这两个概念不是"可比的".这个问题是关于他们是如何联系的,特别是(如@StoryTeller所说),讨论(如何):

移动语义有助于更多地使用值类型.

c++ move-semantics c++11

1
推荐指数
1
解决办法
391
查看次数