public member function
<locale>

std::codecvt::unshift

result unshift (state_type& state,    extern_type* to, extern_type* to_limit, extern_type*& to_next) const;
取消移位转换状态
将移位 state 状态所需的字符序列写入 to

在字符编码转换(例如由 codecvt::out 发起的转换)期间,state 可能已被 shifted 移位到非默认状态,特别是当目标范围无法容纳转换产生的所有字符时。通过将此函数与额外的存储一起调用,将返回移位状态到默认状态所需的剩余序列写入 to(最多占用 to_limit)。

函数返回时,to_next 指向成功写入的最后一个元素的下一个位置。

在其操作过程中,此函数仅调用虚拟受保护成员 codecvt::do_unshift,该成员负责执行上述操作。

在内部,此函数仅调用虚拟受保护成员 do_unshift,该成员默认情况下按照上述描述执行操作。

参数

state
一个 state 对象,如面实例所要求的。
通常,这是一个 mbstate_t 类型的对象,其状态已移位到非默认值(通过调用 codecvt::out)。
成员类型 state_type 是面类型的状态类型(定义为 codecvt 的第三个模板参数 stateT 的别名)。
to, to_limit
指向目标序列的起始和结束字符的指针。使用的范围最多为 [to,to_limit),它包含 toto_limit 之间的所有字符,包括 to 指向的字符,但不包括 to_limit 指向的字符。
取消移位操作不一定需要填满整个范围,也可能在完成之前耗尽它。
成员类型 extern_type 是该 facet 的外部字符类型(定义为 codecvt 的第二个模板参数 externT 的别名)。
to_next
能够指向上述范围中某个元素的指针。函数返回后,此对象指向目标范围内最后一个写入元素之后的元素。

返回值

值为 codecvt_base::result 类型,具有以下可能值:
成员常量intresult
ok0转换成功:所有取消移位状态所需的字符都已成功写入。
partial1部分转换:目标序列 [to,to_limit) 不够长。
范围 [to,to_limit) 已被部分结果填满。可以再次调用该函数并提供额外的存储空间来获取更多取消移位字符。
error2转换错误:发生了某种未指定错误,例如 state 处于无效状态。
noconv3无转换:state 的当前状态不需要取消移位。

数据竞争

访问 facet 对象。
stateto_next 参数以及 [to,to_limit) 范围内的所有字符(最多)都会被修改。

异常安全

如果抛出异常,则 *facet 对象* 不会发生任何更改,尽管目标范围中的字符和 to_next 可能会受到影响。

另见