【发布时间】:2016-12-29 18:22:07
【问题描述】:
如何引入聚合初始化支持以在(例如)STL 容器中正确构建它们?我的意思是:
struct A { int i; char c; };
std::list< A > l; // empty
l.insert(std::memberwise, 1, '2');
// <=> l.insert({1, '2'});
std::memberwise是一个可能的标签,就像STL中已经存在的std::piecewise_construct、std::allocator_arg等。
理论上可以以这种方式扩展 STL 容器吗?有没有最好的方法(“STL-way”)来做到这一点?它可能是什么样子?
问题是关于界面设计和(内部)实现的可能性(不是细节)。
我确定容器在内部使用 ::new (static_cast< void * >(pstorage) value_type(std::forward< Args >(args)...); 之类的东西。我敢肯定,用大括号替换括号会带来重大变化。因为不收窄,例如
另外
一般在cmets中提到的l.insert({1, '2'});会导致value_type的过度移动。这一步很可能会被任何现代编译器优化,但无论哪种方式都有过多的大括号。
【问题讨论】:
-
在您的具体情况下,
l.insert({1, '2'});在 C++11 中工作。 -
@Chad 是的,AFAIK,但
l.emplace{,_back}(1, '2');- 不是。 -
@Orient 您可能需要考虑为初始化 i 和 c 的结构添加一个构造函数。据我所知,对于“就地”容器函数来就地构造对象,您需要这个。如果您通过聚合初始化执行
emplace或emplace_back,它实际上会创建一个对象,然后将其复制到结构中。 -
@RyanP 对于通用代码,这是不可能的。没有
std::is_aggregate来检测聚合以将它们包装到aggregate wrapper 中。
标签: c++ stl containers aggregate c++17