相关疑难解决方法(0)

自动生成的移动构造函数导致非法行为

我问了一个关于移动构造函数的问题,我尚未接受答案,因为即使我开始掌握其他问题,我对问题的某些方面感到更加困惑.特别是,我发现了一个令人惊讶的案例,其中g ++和clang ++都生成了错误的移动构造函数.

问题摘要

  • g ++和clang ++显然违反了在明确定义析构函数时不生成move-constructors的规则; 为什么?这是一个错误,还是我误解了发生了什么?
  • 为了正确,这些(可能是非法的)移动构造函数应该使RHS指针成员无效,但它们不会.为什么不?
  • 似乎避免不需要的行为的唯一方法是为在析构函数中使用的每个类显式定义一个正确的移动构造delete函数.Qt库(版本5.4)是否这样做?

第1部分:非法自动生成的构造函数?

请考虑以下代码:

class NoMove
{
  public:
    ~NoMove() {}
};
int main()
{
  std::cout << "NoMove move-constructible? " <<
    std::is_move_constructible<NoMove>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

使用g++4.9.2和clang++3.5.1 编译,此代码打印:

NoMove move-constructible? 1
Run Code Online (Sandbox Code Playgroud)

...但是由于NoMove有一个明确定义的析构函数,我希望应该自动生成移动构造函数和复制构造函数.请注意,意外的构造函数生成不是因为析构函数是微不足道的; 当析构函数delete[]是一个数组(!!)时,我得到了相同的行为,我甚至能够编译需要有效移动构造函数的代码(!!!!!).(见下面的例子.)这里发生了什么?在这里自动生成移动构造函数是否合法,如果是,为什么?

第2部分:(可能是非法的)自动生成的构造函数导致未定义的行为?

看来,提供安全的移动构造函数时delete涉及相当简单,但我只是想确保我的理解:当一个类包含一个指向成员,拥有基本数据,有没有任何在它是不正确和案例在将目标指针设置为旧值后,移动构造函数是否足以使RHS指针无效?

请考虑以下示例,该NoMove示例与上面的示例类似,并基于我原来的问题:

class DataType
{
  public:
    DataType()
    {
      val …
Run Code Online (Sandbox Code Playgroud)

c++ qt pointers move-semantics c++11

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

标签 统计

c++ ×1

c++11 ×1

move-semantics ×1

pointers ×1

qt ×1