我理解,在C++20之前,迭代器只是由标准定义的一种概念。现在在C++20中,它们成为了真正的语言概念,并在编译时进行检查。我想知道我是否可以安全地假设我可以在我的API中使用C++20迭代器并将其传递给任何早于C++20的API而不会出现问题:
#include <string>
#include <concepts>
#include <cstdio>
#include <utility>
auto write_string(std::input_iterator auto it) -> void { // <-- C++20 iterator
std::string ret = "Danger";
std::copy(ret.begin(), ret.end(), it); // <-- requires LegacyInputIterator
}
int main()
{
std::string str = "Austin is my middle name";
write_string(str.begin());
printf("%.*s\n", (int)str.size(), str.data());
}
decltype(it)
和decltype(str.begin())
将产生相同的类型(忽略值类别)。它们不是“可转换的”,它们是同一件事情。 - Yksisarvinenstd::vector<int> v{}; write_string(v.begin());
无论是否使用概念,都将无法编译。您可以接受std::string::iterator
作为参数,但这会阻止std::vector<char>::iterator
的传递。如果您想要一个检查此特定“复制”是否可以被调用的概念,您可以设计自己的概念来检查该类型是否为std::output_iterator
并且std::is_same_v<*it, char>
。但我认为这有点过头了。 - Yksisarvinen