为什么必须复制std :: initializer_list的元素?

cppreference说:

基础数组是类型为const T [N]的临时数组,其中 每个元素已被复制初始化(除了缩小 转换无效)) 原始的初始化程序列表。基础数组的生命周期是 与其他任何临时对象相同,除了初始化 数组中的initializer_list对象延长了 数组完全类似于将引用绑定到临时(具有相同的 异常,例如用于初始化非静态类成员)。的 基础数组可以分配在只读内存中。

此决定背后的原因是什么?为什么移动不正常?

复制省略号怎么办?

struct A { A(const A&){ std::cout << "Oh no,a copy!\n"; } };
struct B { B(std::initializer_list<A> il); };

int main()
{
    B b{ A{} };
    return 0;
}

我的编译器将副本删除。但是这些副本是否一定会被省略?

ahricher1 回答:为什么必须复制std :: initializer_list的元素?

C ++中的“复制初始化”并不意味着必须复制任何内容。它只是用于进行初始化的约束的正式名称。例如,在初始化副本时,显式字符不是候选对象。因此,以下代码will be ill-formed

#include <iostream>
#include <initializer_list>

struct A {
    explicit A() = default;
    A(const A&){ std::cout << "Oh no,a copy!\n"; } 
};
struct B { B(std::initializer_list<A> il); };

int main()
{
    B b{ {} };
    return 0;
}

列表中的单个成员需要从{}复制初始化,这需要调用默认的c'tor。但是,由于将c'tor标记为显式,因此无法进行初始化。

在C ++ 17之前肯定可以进行复制省略,并且在某些情况下从C ++ 17开始是强制性的。在您的示例中,在C ++ 17编译器下,由于提供的初始化程序是prvalue(纯rvalue,不是对象),因此C ++的初始化规则要求直接 初始化目标。 ,而不创建中间对象。即使上下文称为“复制初始化”,也没有多余的对象。

本文链接:https://www.f2er.com/2577741.html

大家都在问