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

Leo*_*eon 12 c++ string iterator reference string-view

我有一堂课:

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
Run Code Online (Sandbox Code Playgroud)

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

extern bool loadData( const string& strSymbol );
Run Code Online (Sandbox Code Playgroud)

如果有局部变量:

Symbol_t   symbol( "123456" );
Run Code Online (Sandbox Code Playgroud)

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

loadData( string( symbol.strVw().begin(), symbol.strVw().end() ) );
Run Code Online (Sandbox Code Playgroud)

我必须这样做:

string_view svwSym = symbol.strVw();
loadData( string( svw.begin(), svw.end() ) );
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sto*_*ica 19

没有必要使用 c'tor 进行范围。std::string有一个构造函数,它根据std::string_view,列表中的数字 10进行操作。其中的效果是

template < class T >
explicit basic_string( const T& t, const Allocator& alloc = Allocator() ); 
Run Code Online (Sandbox Code Playgroud)

将 t 隐式转换为字符串视图 sv ,就像 by 一样std::basic_string_view<CharT, Traits> sv = t;,然后使用 , 的内容初始化字符串sv,就像 by 一样basic_string(sv.data(), sv.size(), alloc)。此重载仅在std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>为 true 和std::is_convertible_v<const T&, const CharT*>false 时参与重载决议。

由于这两个条件std::string_view本身都成立,我们可以loadData简单地将调用编写为:

loadData( std::string( symbol.strVw() ) );
Run Code Online (Sandbox Code Playgroud)