为什么即将推出的范围库不支持范围内的容器初始化?

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

简介

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

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] or [container.requirements] 中找不到任何提及它的地方。 Ranges 库也没有引入一组新的容器。

为什么 Ranges 库不支持从一个范围进行容器初始化?原理是什么?

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

这并不是说此功能不受欢迎,只是关于它还存在一些未解决的问题,但它仍在开发中(请参阅 p1206)。

如果阅读论文修订版 1 的基本原理,它会提到向标准容器添加构造函数被证明是行不通的。可能是因为标准容器在初始化时进行了大量改造,以至于重载解析成为一场噩梦。