它没有在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 有用,尽管我几乎不关心一次复制整个字符串,但是我可以逃避做任何mallocstrncpy,而且我也不想写代码分支以确保大小限制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/

10-11 21:57
查看更多