【发布时间】:2023-03-12 18:54:01
【问题描述】:
通过转发就地构造,我指的是 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);
【问题讨论】:
-
你有什么问题?
-
类似
Type object((foo, bar), anotherFoo, anotherBar);? -
我对这个问题的原始陈述不清楚。现已更新。
-
您是否尝试过编写使用
{}的转发构造函数类型的东西? -
std::allocator::construct(和std::allocator_traits::construct)被指定使用()而不是{},并且出于兼容性原因必须保持使用(vector<int>(10, 10)与vector<int>{10, 10})。如果()不起作用,可以使用an LWG issue 使其回退到使用{}。
标签: c++ c++11 language-lawyer object-construction list-initialization