如何创建不可移动/复制可构造的对象数组

时间:2015-08-03 15:55:16

标签: c++ arrays c++11 constructor

如果我要创建一个像这样的对象数组,我会遇到麻烦:

SM sc[8]{{0},{1},{2},{3},{4},{5},{6},{7}};

SM的构造函数定义为:

SM::SM(int);

因为在c ++ Each member is copy-initialized from the corresponding initializer-clause.中,我有一个未解决的问题。

我已经读过:

Move Constructors and Static Arrays

Initialization of member array objects avoiding move constructor

Move constructor is required even if it is not used. Why?

constexpr array of constexpr objects using move ctor

是的,所有答案都非常清楚地描述了列表初始化的内容,但我现在无法了解如何获取静态的对象数组。

是否有解决该问题的方法?创建一个指针数组并使用新的或新的@操作进行运行时初始化需要更多的运行时内存空间。这有点问题,因为我在AVR 8位控制器上。

2 个答案:

答案 0 :(得分:3)

只是一些反馈,在答案中由于代码段:

3rd link处的代码调整为:

#include <iostream>
using namespace std;

struct SM {
    int val;
    SM(int a) : val(a) { cout <<"Constructor val="<<a<<endl;}
    ~SM() { cout << "Destructor val="<<val<<endl; }

    SM(const SM& ) = delete;
    SM(SM&& ) = delete;
};

int main()
{
    SM sc[8] = { {0},{1},{2},{3},{4},{5},{6},{7} };
    return 0;
}

使用

进行编译
g++ -std=c++11

并且正在运行,结果是:

Constructor val=0
Constructor val=1
Constructor val=2
Constructor val=3
Constructor val=4
Constructor val=5
Constructor val=6
Constructor val=7
Destructor val=7
Destructor val=6
Destructor val=5
Destructor val=4
Destructor val=3
Destructor val=2
Destructor val=1
Destructor val=0

究竟是什么问题?

答案 1 :(得分:1)

“copy-initialized”并不意味着“调用复制构造函数。”

C ++ 14 8.5 / 15:

  

形式出现的初始化
T x = a;
  

以及参数传递,函数返回,抛出异常,处理异常以及聚合成员初始化都称为复制初始化

请注意,初始化程序和初始化对象可以有不同的类型。

因此,您可以使用初始化列表初始化数组,而无需调用任何复制构造函数。