为什么即将发布的Ranges库不支持某个范围内的容器初始化?

时间:2019-05-02 10:59:32

标签: c++ iterator std c++20

简介

随着即将到来的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库不支持某个范围内的容器初始化?理由是什么?

2 个答案:

答案 0 :(得分:6)

C ++ 20的目标是获得范围!在此之前,尚有一些障碍需要克服,但是一旦克服了这些障碍,委员会就很可能​​认为最好引入一个可能的功能库,该功能库可能功能不完整,而不是根本没有功能。

这并不是说此功能是不受欢迎的,只是关于此功能尚有一些悬而未决的问题,但仍在进行中(请参见p1206)。

如果您阅读了本文修订版1的基本原理,则表明将构造函数添加到标准容器中被证明是行不通的。可能是因为标准容器在初始化时进行了很多改装,以至于过载解析成为一场噩梦。

答案 1 :(得分:-1)

Vector,其他容器已经具有采用initializer_list的构造函数。这样,std::vector<int> vec{foo}调用该initializer_list构造函数,并表示“用foo作为元素构造向量”。您建议的语法会有冲突。

这并不一定意味着不可能。但这意味着已经存在与API的交互,并且存在向后兼容性问题,这将使标准化速度变慢,并且难以投票。