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

L. *_* F. 3 c++ iterator std c++20

介绍

随着即将到来的Ranges库的出现,用两个迭代器来表示一个范围的需求几乎消失了。例如,代替

if (std::equal(begin(foo), end(foo), begin(bar), end(bar)))
Run Code Online (Sandbox Code Playgroud)

我们有

if (std::ranges::equal(foo, bar))
Run Code Online (Sandbox Code Playgroud)

后者之所以可以说是优越的,不仅因为它的简洁性,还因为它避免了忽略end(bar)和欢迎绑定错误的常见陷阱。

问题

下面的代码怎么样?

std::vector<int> vec{begin(foo), end(foo)};
Run Code Online (Sandbox Code Playgroud)

foo范围在哪里。使用Ranges,我希望将其简化为

std::vector<int> vec{foo};
Run Code Online (Sandbox Code Playgroud)

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

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

Sto*_*ica 6

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

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

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