C++20迭代器是否可兼容转换为LegacyIterator?
C++20迭代器与旧API兼容性问题
问题描述
我理解C20之前迭代器只是标准定义的概念,而C20中迭代器成为编译时检查的语言概念。想确认:在API中使用C20迭代器,并将其传入任何C20之前的API,是否不会出现问题?
代码示例
#include <string> #include <concepts> #include <cstdio> #include <utility> auto write_string(std::input_iterator auto it) -> void { // <-- C++20迭代器概念约束 std::string ret = "Danger"; std::copy(ret.begin(), ret.end(), it); // <-- 调用C++20前就存在的std::copy,要求LegacyInputIterator } int main() { std::string str = "Austin is my middle name"; write_string(str.begin()); printf("%.*s\n", (int)str.size(), str.data()); }
结论与解释
- 通常不会出现问题。C20的迭代器概念是对C20之前“遗留迭代器”体系的兼容升级,标准明确设计C++20迭代器概念要覆盖对应遗留迭代器的所有要求。
- 比如代码中的
std::input_iterator概念,任何满足它的类型必然满足C++20前的LegacyInputIterator要求,因此传给依赖遗留迭代器的旧API(如std::copy)完全合法。 - 唯一例外是自定义迭代器刻意只实现C++20概念的要求,却不兼容遗留迭代器的语义(这种情况违背标准设计意图,属于非常规操作)。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

