我无法向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_view
到std::basic_string
。构造函数根据错误消息采用basic_string
。
为什么在这里不打电话给string_view
就不能逐字使用string_view::data()
吗?
答案 0 :(得分:5)
这个问题对我来说很奇怪,因为在这里应该只发生1次隐式转换:
std::string_view
到std::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
。