它没有在std::string constructor doc中明确列出((编辑:人们在这里说我应该引用实际的cppreference而不是cplusplus.com)),但显然可以。这意味着就像strncpy
一样,不是吗?
它起作用是因为它首先隐式地初始化了另一个std::string
对象,该对象是传入的const char* string
的副本?这是否意味着即使最终仅提取一定长度的子字符串,也要花很多精力来复制整个字符串?
也似乎这样的构造有点像string (const char* s+pos, size_t len)
,只是引用在这里说如果len大于字符串长度,则会导致undefined behavior
;但是在string (const char* s, size_t pos, size_t len = npos)
中,如果len再一次传递了null终止符,那就很好了。大概是因为,我想这是在内部处理cpp字符串对象级别的内容,而前者正在处理指针。
为什么不在c++引用文档中列出该行为?
我的猜测是内部复制到std::string
对象然后将string (const string& str, size_t pos, size_t len = npos)
应用于它的一种怪异组合,因此它不被视为“标准”。就是说,当我不得不将输入作为char*
时,我发现这个 super 有用,尽管我几乎不关心一次复制整个字符串,但是我可以逃避做任何malloc
和strncpy
,而且我也不想写代码分支以确保大小限制len不会超出范围。
最佳答案
由于存在构造函数,因此可以工作:
std::basic_string( const basic_string& other,
size_type pos,
size_type count = std::basic_string::npos,
const Allocator& alloc = Allocator() );
const char *
可隐式转换为std::basic_string
,因此在您编写(例如)std::string s {"abc", 1, 2};
时,在上述转换之后调用上述构造函数Live demo
为了解决您的效率问题,从
char *
到std::basic_string
的隐式转换涉及到临时结构的构建,因此可以复制字符串。关于c++ - 为什么字符串(const char * s,size_t pos,size_t len = npos)有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57564732/