我无法将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()
发布于 2019-07-29 19:12:26
这个问题对我来说很奇怪,因为这里应该只有一个隐式转换:
std::string_view到std::basic_string。
string_view不能隐式转换为string。构造函数(ok,扣减指南,但无论如何)被标记为explicit。
这应该有效(未经测试):
std::string_view val = "Hello";
std::istringstream ss(std::string(val), std::ios_base::in);显式的原因是这是一个(潜在的)昂贵的操作;涉及内存分配和数据复制。相反的转换(string -> string_view)很便宜,因此是隐式的。
发布于 2021-11-11 22:27:52
除了其他答案之外,如果使用string视图的目的是避免char缓冲区的副本,那么将其复制到std::string中是不令人满意的。
在这种情况下,您可以使用Boost的iostream作为字符串流的插入替代,从而避免复制缓冲区。
#include <boost/iostreams/stream.hpp>
boost::iostreams::stream<boost::iostreams::array_source> stream(buffer, size);发布于 2019-07-29 19:11:37
这里的问题是,接受std::string的std::string_view构造函数被标记为explicit。这意味着您不能在隐式转换序列中使用它。
您需要添加强制转换来显式转换它,或者使用std::string/const char[]代替。
https://stackoverflow.com/questions/57259965
复制相似问题