移动类的数组成员所需的ctor



我想要一个类,它具有另一个既没有复制构造函数也没有移动构造函数的类的数组成员("C-array")。不幸的是,编译器给了我一个错误消息,告诉我内部类的移动构造函数是必需的。我不明白为什么在编译时给定大小的数组需要移动。更奇怪的是,当数组不是类成员而是自动堆栈变量时,编译器不会抱怨。下面的代码说明了我的问题。它按照预期编译并运行,第一行(即使用move构造函数),输出显示未调用move构造函数。但是,当第一行被注释掉时,我在第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 calledn"; }
#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 calledn"; }
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

第37行是一个静态初始值设定项,因此它是就地构建的。所以不需要移动任何东西。

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

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

最新更新