如何从 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_view
、number 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 执行子字符串和各种其他操作。
我有一个 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_view
、number 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 ofsv
, as if bybasic_string(sv.data(), sv.size(), alloc)
. This overload only participates in overload resolution ifstd::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>
is true andstd::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 执行子字符串和各种其他操作。