为什么即将推出的范围库不支持范围内的容器初始化?
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 的基本原理,它会提到向标准容器添加构造函数被证明是行不通的。可能是因为标准容器在初始化时进行了大量改造,以至于重载解析成为一场噩梦。
简介
随着即将推出的范围库,用两个迭代器表示范围的需求几乎消失了。例如,而不是
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 的基本原理,它会提到向标准容器添加构造函数被证明是行不通的。可能是因为标准容器在初始化时进行了大量改造,以至于重载解析成为一场噩梦。