为什么我不能从 std::string 迭代器创建 std::string_view ?

Con*_*nst 5 c++ stdstring string-view c++17

可以很容易地std::string_view从 a创建一个std::string。但是如果我想创建一个范围的字符串视图,std::string使用迭代器是std::string行不通的。

这是我尝试过的代码:https : //gcc.godbolt.org/z/xrodd8PMq

#include <iostream>
#include <string>
#include <string_view>
#include <iterator>

int main()
{
    std::string str{"My String"};
    std::string_view strView{str};  // works
    //std::string_view strSubView{str.begin(), str.begin() + 2}; // error
}
Run Code Online (Sandbox Code Playgroud)

当然,也许我们可以将子字符串制作出来str并用于制作字符串视图strSubView,但是还有一个额外的字符串创建。

我发现std::basic_string_view第 5 个构造函数采用迭代器的范围。

template<class It, class End>
constexpr basic_string_view(It first, End last);
Run Code Online (Sandbox Code Playgroud)

但它仅仅是std::stringor std::basic_string_view本身的迭代器吗?如果不是 forstd::string迭代为什么我们不应该有一个,毕竟是字符串视图:

描述了一个对象,它可以引用一个常量连续的类似字符的对象序列!

取char连续序列的范围,不应该算吗?

Cal*_*eth 6

该构造函数已添加到 C++20 中。如果您使用 C++17 编译器进行编译,则它不存在。

您可以编写一个执行相同操作的函数

std::string_view range_to_view(std::string::iterator first, std::string::iterator last) {
    return first != last ? { first.operator->(), last - first } : { nullptr, 0 };
}
Run Code Online (Sandbox Code Playgroud)

  • @Const它是一个未实现的临时对象,它在调用站点就地构建 (2认同)