【发布时间】:2020-12-31 04:49:27
【问题描述】:
许多标准库算法在 C++20 中有两个版本:一个在 std 命名空间中,另一个在 std::ranges 命名空间中同名。比如std::ranges::count和std::count都用于统计满足某个谓词的元素个数。
为什么这些算法有两个版本?
【问题讨论】:
许多标准库算法在 C++20 中有两个版本:一个在 std 命名空间中,另一个在 std::ranges 命名空间中同名。比如std::ranges::count和std::count都用于统计满足某个谓词的元素个数。
为什么这些算法有两个版本?
【问题讨论】:
范围功能将 C++20 概念添加到迭代器和范围,并将其算法的定义等限制在这些概念中。但是,C++20 概念与 C++17 命名要求有不同的要求。通常,满足 C++17 要求的类型将满足 C++20 概念等价物but not in all cases1。虽然更新您自己的代码以使其适用于 C++20 概念通常很容易,但它仍然会破坏用户编写的迭代器的向后兼容性,以停止在 C++20 中编译。
因此,他们没有将受限算法强加给用户,而是创建了您可以选择使用的新算法。因此,没有代码损坏。
1:另外,因为 C++17 的需求从未被任何东西真正检查过,所以很容易意外地编写一个没有完全实现它们的迭代器要求。您使用的算法实际上不能使用您未实现的功能,因此看起来您实现了您需要的功能。如果您没有针对多个标准库实现测试代码,则尤其如此。如果 C++20 开始检查您的迭代器,它会突然破坏您在技术上已损坏但功能正常的代码。
【讨论】: