我无法将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);
这个问题对我来说很奇怪,因为在这里只应该有一种隐式转换:从 std::string_view
到 std::basic_string
。但根据错误消息,构造函数正在使用一个 basic_string
。
为什么我不能直接使用 string_view
而不调用 string_view::data()
?
string_view::data()
这个方法并不正确,因为stringstream 期望的是一个以空字符结尾的字符串。 - user4442671string_view
只会让事情变得比以前更加复杂和混乱,而以前的事情要么就是std::string
要么就是char*
。到目前为止,我并不喜欢它。 - void.pointerstring_view
的末尾,寻找空字符。 - Marshall Clow