如何在不复制或移动构造临时元素的情况下初始化数组?当元素具有显式delete
d 复制或移动构造函数时,只有当元素具有默认 ctor 或具有所有默认参数的 ctor 并且我执行以下操作之一时,我才能初始化数组:(a)明确声明数组,(b ) 直接初始化和零初始化数组,或 (c) 复制初始化和零初始化数组。直接(但不是零)初始化和复制(但不是零)初始化都不会编译。
struct Foo
{
Foo(int n = 5) : num(n) {}
Foo(const Foo&) = delete;
//Foo(Foo&&) = delete; // <-- gives same effect
int num;
};
int main()
{
// Resultant arrays for 'a1', 'a2', and 'a3' are two
// 'Foo' elements each with 'num' values of '5':
Foo a1[2]; // plain declaration
Foo a2[2] {}; // direct initialization and zero initialization
Foo a3[2] = {}; // copy initialization and zero initialization
Foo a4[2] {5, 5}; // direct initialization -> ERROR
Foo a5[2] = {5, 5}; // copy initialization -> ERROR
}
- 这 3 种方法是在不复制/移动临时元素的情况下初始化数组的唯一方法吗?
a1
将,a2
和a3
count 作为初始化吗?ega1
是一个声明,但它的元素获取初始值,尽管是默认值。- 他们中的任何一个都是错误吗?我用 C++14 标志做了这个 GCC 6.3.0。
- 为什么复制初始化结合零初始化仍然在复制初始化的范畴下工作?
- 一般来说,所有带有花括号的数组初始化都只是临时元素的构造(除非在没有删除复制或移动构造函数时省略(或者省略不适用于数组?)),然后是每个元素的复制、移动或混合复制和移动构造?