gpt4 book ai didi

c++ - 转发就地构建和列表初始化

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:12 25 4
gpt4 key购买 nike

转发就地 build ,我认为是指std::allocator::construct以及各种 emplace 方法,例如 std::vector::emplace_back .我只是发现 C++ 中的转发就地构造没有(不能?)利用列表初始化语法。结果,似乎永远无法转发就地构建聚合。我只想确定转发就地构造是否不支持列表初始化,因此不支持聚合类型。这是由于语言的限制吗?有人可以提供有关此问题的标准引用吗?下面是一个例子:

虽然我们可以像这样直接就地构建

int(*p)[3] = ...;
new(p) int[3]{1, 2, 3};

我们不能像这样进行转发就地构建

std::allocator<int[3]> allo;
allo.construct(p, 1, 2, 3);

最佳答案

虽然 {} 被称为统一初始化语法,但它远非通用。

举这两个例子:

size_t a = 3;
size_t b = 1;
std::vector<size_t> v1{a,b};
std::vector<size_t> v2(a,b);

在第一种情况下,我们构建了一个包含两个元素的 vector ,31

在第二种情况下,我们创建了一个 vector ,其中包含 1,1,1 -- 1 的 3 个拷贝。

live example .

因此,在某些情况下,基于 {} 的构造可能会导致与基于 () 的构造不同的行为。此外,在上述情况下,无法使用 {} 构造(据我所知)达到“1 的 3 个拷贝”语法。但是 {3,2} 的情况可以通过简单地显式创建初始化列表并将其传递给 () 来处理。

由于大多数采用初始化器列表的类型都可以通过显式传入初始化器列表来进行 emplace 构造,并且 C++ 标准库是为具有构造器的类型设计的,而不是没有构造器的类型,因此 C++ 标准库几乎统一使用 () 而不是 {}

缺点是无法通过此机制放置想要列表初始化的类型。

理论上,可以将使用 {} 构造的 list_emplace 方法添加到每个接口(interface)。我鼓励你提出这个建议!

关于c++ - 转发就地构建和列表初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29565039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com