随着即将到来的Ranges库,几乎没有必要用两个迭代器来表示一个范围。例如,代替
if (std::equal(begin(foo), end(foo), begin(bar), end(bar)))
我们有
if (std::ranges::equal(foo, bar))
后者可以说是优越的,不仅因为它的简洁,而且因为它避免了遗漏end(bar)
并欢迎绑定错误的常见陷阱。
下面的代码怎么样?
std::vector<int> vec{begin(foo), end(foo)};
其中foo
是范围。有了Ranges,我希望可以将其简化为
std::vector<int> vec{foo};
但是,我在[vector]或[container.requirements]中找不到任何提及。 Ranges库也没有引入一组新的容器。
为什么Ranges库不支持某个范围内的容器初始化?理由是什么?
答案 0 :(得分:6)
C ++ 20的目标是获得范围!在此之前,尚有一些障碍需要克服,但是一旦克服了这些障碍,委员会就很可能认为最好引入一个可能的功能库,该功能库可能功能不完整,而不是根本没有功能。
这并不是说此功能是不受欢迎的,只是关于此功能尚有一些悬而未决的问题,但仍在进行中(请参见p1206)。
如果您阅读了本文修订版1的基本原理,则表明将构造函数添加到标准容器中被证明是行不通的。可能是因为标准容器在初始化时进行了很多改装,以至于过载解析成为一场噩梦。
答案 1 :(得分:-1)
Vector,其他容器已经具有采用initializer_list
的构造函数。这样,std::vector<int> vec{foo}
调用该initializer_list
构造函数,并表示“用foo
作为元素构造向量”。您建议的语法会有冲突。
这并不一定意味着不可能。但这意味着已经存在与API的交互,并且存在向后兼容性问题,这将使标准化速度变慢,并且难以投票。