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

How to correctly create std::string from a std::string_view?

我有一个 class:

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++ 编译器的预期结果。

如有任何提示,我们将不胜感激!谢谢。

Is the first method correct?

因为 strVw returns 相同 string_view:它们都指向相同的 m_V 并且具有相同的大小。

此处的正确性取决于 strVw 的实现方式。

or I must use the second one?

我要创建一个转换函数:

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

并使用它:

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

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

不需要使用 c'tor 获取范围。 std::string 有一个根据列表中的 std::string_viewnumber 10 操作的构造函数。其中的效果是

template < class T >
explicit basic_string( const T& t, const Allocator& alloc = Allocator() ); 

Implicitly converts t to a string view sv as if by std::basic_string_view<CharT, Traits> sv = t;, then initializes the string with the contents of sv, as if by basic_string(sv.data(), sv.size(), alloc). This overload only participates in overload resolution if std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> is true and std::is_convertible_v<const T&, const CharT*> is false.

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

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

如果您在 C++ 中有一些 string_view 想要转换为字符串格式(例如,您可以在完成所有分析后 return 转换为一个函数),您可以这样做通过这样做改变:

string_view sv;
string s = {sv.begin(), sv.end()};

反过来,要从字符串中获取 string_view(以便获取指向该字符串的指针),您可以这样做:

string s;
string_view sv = string_view(s);

请注意,可以像对字符串一样对 string_view 执行子字符串和各种其他操作。