如何从 std::string_view 正确创建 std::string?

新手上路,请多包涵

我有一堂课:

 class Symbol_t {
public:
   Symbol_t( const char* rawName ) {
      memcpy( m_V, rawName, 6 * sizeof( char ) );
   };

   string_view strVw() const {
      return string_view( m_V, 6 );
   };

private:
   char m_V[6];

}; // class Symbol_t

并且有一个我无法修改的 lib-func:

 extern bool loadData( const string& strSymbol );

如果有局部变量:

 Symbol_t   symbol( "123456" );

当我需要调用loadData时,我不敢这样做:

 loadData( string( symbol.strVw().begin(), symbol.strVw().end() ) );

我必须这样做:

 string_view svwSym = symbol.strVw();
loadData( string( svw.begin(), svw.end() ) );

我的问题:第一种方法正确吗?或者我必须使用第二个?

因为我认为在方法 1 中,我传递给 std::string 的构造函数的迭代器是两个不同的 string_vew 对象,理论上结果是未定义的,即使我们几乎所有的 C++ 编译器都会得到预期的结果。

任何提示将不胜感激!谢谢。

原文由 Leon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

无需使用 c’tor 获取范围。 std::string 有一个根据 std::string_view 运行的构造函数,列表中的 第 10 位。其中的效果是

> template < class T >
> explicit basic_string( const T& t, const Allocator& alloc = Allocator() );
>
> ```
>
> 隐式将 t 转换为字符串视图 sv,就像 `std::basic_string_view<CharT, Traits> sv = t;` ,然后使用 `sv` 的内容初始化字符串,就像 `basic_string(sv.data(), sv.size(), alloc)` 。仅当 `std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>` 为真且 `std::is_convertible_v<const T&, const CharT*>` 为假时,此重载才参与重载解析。

由于这两个条件都适用于 `std::string_view` 本身,我们可以简单地编写对 `loadData` 的调用:

loadData( std::string( symbol.strVw() ) );

”`

原文由 StoryTeller - Unslander Monica 发布,翻译遵循 CC BY-SA 4.0 许可协议

第一种方法正确吗?

这是因为 strVw 返回相同的 string_view s:它们都指向相同的 m_V 并且具有相同的大小。

这里的正确性取决于 strVw 是如何实现的。

或者我必须使用第二个?

我会创建一个转换函数:

 inline std::string as_string(std::string_view v) {
    return {v.data(), v.size()};
}

并使用它:

 loadData(as_string(symbol.strVw()));

无论 strVw 实现如何,此方法都是安全的。

原文由 Maxim Egorushkin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题