为什么即将到来的范围库不支持一个范围的容器初始化

Why does the upcoming Ranges library not support container initialization from a range?

本文关键字:范围 一个 初始化 即将到来 不支持 为什么      更新时间:2023-10-16

简介

随着即将到来的范围库,需要用两个迭代器表示范围的需要几乎消失了。例如,而不是

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是一个范围。使用范围,我希望将其简化为

std::vector<int> vec{foo};

但是,我没有在[vector]或[container.ulequirentess]中找到任何提及。山脉库也没有引入一组新的容器。

为什么范围库不支持一个范围的容器初始化?什么是理由?

C 20的目标是获得范围!在此之前,有几个障碍要克服,但是一旦克服了这些障碍,委员会可能认为最好是引入一个可行的山脉图书馆,这可能不是完整的,而不是根本没有范围。

这并不是说此功能是不可取的,只是只剩下一些关于它的开放问题,但仍在进行中(请参阅P1206(。

如果人们读了本文修订版1的基本原理,则提到将构造函数添加到标准容器中被证明是不可行的。很可能是因为标准容器对初始化进行了太多的改装,以至于超负荷分辨率成为一场噩梦。