为什么string_view构造函数不接受一对迭代器

Kam*_*air 7 c++ string-view string-span

boost中的string_ref和GSL中的string_span都没有定义带有一对迭代器的构造函数.这个决定的原因是什么?

通常这不是什么大问题,我可以像这样创建string_ref:

boost::string_ref s(start, std::distance(start, finish));
Run Code Online (Sandbox Code Playgroud)

但我希望构造函数采用一对迭代器的原因是因为我的代码看起来像这样:

template<typename Type, typename Iterator>
void func(const Iterator& begin, const Iterator& end)
{
    Type s(begin, end);
    //do stuff with s
}
Run Code Online (Sandbox Code Playgroud)

目前,我可以这样称呼它:

func<std::string>(start, finish)
Run Code Online (Sandbox Code Playgroud)

我想将其更改为:

func<boost::string_ref>(start, finish) //compile error
Run Code Online (Sandbox Code Playgroud)

但是该代码将无法编译,因为缺少构造函数在string_ref中使用一对迭代器

mat*_*atz 5

boost::string_ref是对字符串的简单引用,其形式为指向具有预定长度的连续内存块的指针。由于迭代器更为通用,因此您不能假设您的start, finish范围引用的是连续内存块。

另一方面,std::string可以从Iterators定义的范围构造a,因为无论基础数据结构是什么,它都将简单地复制范围值。

  • 这实际上不是一个完全令人信服的论点。从一个std :: string :: iterator构造一个boost :: string_ref是合理的。但是,即使那样也不允许。 (3认同)

Kam*_*air 1

看来我犯了一个错误。gsl::string_span确实有一个接受开始和结束迭代器的构造函数。因此,从迭代器对创建 string_view 没有任何问题,并且缺少它boost::string_ref可能只是一个疏忽。

就我而言,我最终自己继承boost::string_ref并添加了构造函数。