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进行操作。其中的效果是
Run Code Online (Sandbox Code Playgroud)template < class T > explicit basic_string( const T& t, const Allocator& alloc = Allocator() );将 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)