我希望有一个类,其中包含另一个既没有副本也没有移动构造函数的类的数组成员(" 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
答案 0 :(得分:1)
第37行是静态初始化程序,因此它就构建到位了。所以不需要移动任何东西。
第27行首先分配数组,然后移动初始化器数组。这需要一个移动构造函数。
答案 1 :(得分:0)
我刚刚从Kerrek SB那里了解到,CA ctor(l.37)中初始化列表周围的()括号引起了问题,谢谢! 但仍然有一个悬而未决的问题:()支持l。我的例子37对编译器意味着什么?在运行时,当移动构造函数存在时,它们显然没有效果,因为它没有被调用。