移动类

时间:2016-05-29 14:16:04

标签: c++ arrays c++11 move-semantics

我希望有一个类,其中包含另一个既没有副本也没有移动构造函数的类的数组成员(" C-array")。不幸的是,编译器给了我一条错误消息,告诉我内部类的移动构造函数是必需的。我不明白为什么在编译时给定大小的数组需要移动。对我来说更奇怪的是,当数组不是类成员而是自动堆栈变量时,编译器不会抱怨。 以下代码说明了我的问题。它编译并按预期运行第一行(即使用移动构造函数),输出显示未调用移动构造函数。但是第一行注释掉了,我在第27行得到了一条错误消息(数组作为另一个结构的成员变量),而第37行(数组作为堆栈变量)仍然编译。 请注意,我想使用初始化列表来构造类型A的数组元素,如示例所示。

#define WITH_MOVE_CTOR

#include <iostream>
using namespace std;

struct A {
  A(int i, bool b) : mi(i), mb(b) 
  { }
  A(A&&s)
#ifdef WITH_MOVE_CTOR
  : mi(s.mi),mb(s.mb)
  { cout << s << "move ctor called\n"; }
#else
  = delete;
#endif
  A() = delete;
  A(const A&) = delete;
  A& operator=(const A&) = delete;
  friend ostream & operator<<(ostream & in, const A&a)
  { return in << a.mi << "," << a.mb; }
  void foo() const { cout << *this << " foo called\n"; }
  int mi;
  bool mb;
};

struct CA {
  CA() : m( {{1, true},{2, false}} ) {}
  CA(const A&) = delete;
  CA(A&&) = delete;
  CA& operator=(const CA&) = delete;
  A m[2];
};

int main() 
{
  cout << "C-array:\n";
  A ca[2] = {{1, true},{2, false}};
  ca[1].foo();

  cout << "C-array in struct:\n";
  CA sca;
  sca.m[1].foo();
  return 0;
} 

输出:

C-array:
2,0 foo() called
C-array in struct:
2,0 foo() called

2 个答案:

答案 0 :(得分:1)

第37行是静态初始化程序,因此它就构建到位了。所以不需要移动任何东西。

第27行首先分配数组,然后移动初始化器数组。这需要一个移动构造函数。

答案 1 :(得分:0)

我刚刚从Kerrek SB那里了解到,CA ctor(l.37)中初始化列表周围的()括号引起了问题,谢谢! 但仍然有一个悬而未决的问题:()支持l。我的例子37对编译器意味着什么?在运行时,当移动构造函数存在时,它们显然没有效果,因为它没有被调用。