使用string_view构造istringstream不会编译

时间:2019-07-29 19:02:23

标签: c++ c++17

我无法向std::string_view的构造函数提供std::istringstream。以下代码无法编译(使用Clang v8启用C ++ 17):

std::string_view val = "Hello";
std::istringstream ss(val, std::ios_base::in);

我得到的错误是:

prog.cc:9:24: error: no matching constructor for initialization of 'std::istringstream' (aka 'basic_istringstream<char>')
    std::istringstream ss(val, std::ios_base::in);
                       ^  ~~~~~~~~~~~~~~~~~~~~~~
/opt/wandbox/clang-6.0.0/include/c++/v1/sstream:651:14: note: candidate constructor not viable: no known conversion from 'std::string_view' (aka 'basic_string_view<char>') to 'const std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::string_type' (aka 'const basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >') for 1st argument
    explicit basic_istringstream(const string_type& __s,
             ^

但是这样做:

std::string_view val = "Hello";
std::istringstream ss(val.data(), std::ios_base::in);

这个问题对我来说很奇怪,因为在这里应该只发生1次隐式转换:std::string_viewstd::basic_string。构造函数根据错误消息采用basic_string

为什么在这里不打电话给string_view就不能逐字使用string_view::data()吗?

2 个答案:

答案 0 :(得分:5)

  

这个问题对我来说很奇怪,因为在这里应该只发生1次隐式转换:std::string_viewstd::basic_string

string_view不能隐式转换为string。构造函数(好的,推导指南,但无论如何)都标记为explicit

这应该有效(未试用):

std::string_view val = "Hello";
std::istringstream ss(std::string(val), std::ios_base::in);

之所以明确表示其原因是,这是一项(可能)昂贵的操作;涉及内存分配和数据复制。相反的转换(string-> string_view)很便宜,因此是隐式的。

答案 1 :(得分:1)

这里的问题是,采用std::string的{​​{1}}构造函数被标记为std::string_view。这意味着您不能在隐式转换序列中使用它。

您将需要添加强制转换以显式转换它,或者改用explicit / std::string