首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用string_view构造istringstream不编译

用string_view构造istringstream不编译
EN

Stack Overflow用户
提问于 2019-07-29 19:02:23
回答 3查看 4.1K关注 0票数 7

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

代码语言:javascript
复制
std::string_view val = "Hello";
std::istringstream ss(val, std::ios_base::in);

我得到的错误是:

代码语言:javascript
复制
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,
             ^

然而,这确实是:

代码语言:javascript
复制
std::string_view val = "Hello";
std::istringstream ss(val.data(), std::ios_base::in);

这个问题对我来说很奇怪,因为这里应该只有一个隐式转换:std::string_viewstd::basic_string。构造函数根据错误消息获取一个basic_string

为什么我不能在这里逐字使用string_view而不调用string_view::data()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-29 19:12:26

这个问题对我来说很奇怪,因为这里应该只有一个隐式转换:std::string_viewstd::basic_string

string_view不能隐式转换为string。构造函数(ok,扣减指南,但无论如何)被标记为explicit

这应该有效(未经测试):

代码语言:javascript
复制
std::string_view val = "Hello";
std::istringstream ss(std::string(val), std::ios_base::in);

显式的原因是这是一个(潜在的)昂贵的操作;涉及内存分配和数据复制。相反的转换(string -> string_view)很便宜,因此是隐式的。

票数 8
EN

Stack Overflow用户

发布于 2021-11-11 22:27:52

除了其他答案之外,如果使用string视图的目的是避免char缓冲区的副本,那么将其复制到std::string中是不令人满意的。

在这种情况下,您可以使用Boost的iostream作为字符串流的插入替代,从而避免复制缓冲区。

代码语言:javascript
复制
#include <boost/iostreams/stream.hpp>

boost::iostreams::stream<boost::iostreams::array_source> stream(buffer, size);
票数 4
EN

Stack Overflow用户

发布于 2019-07-29 19:11:37

这里的问题是,接受std::stringstd::string_view构造函数被标记为explicit。这意味着您不能在隐式转换序列中使用它。

您需要添加强制转换来显式转换它,或者使用std::string/const char[]代替。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57259965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档