从我的C标准副本[§27.8.2.1p4]:
basic_stringbuf(basic_stringbuf&& rhs);
Effects: Move constructs from the rvalue rhs. It is
implementation-defined whether the sequence pointers in *this
(eback(), gptr(), egptr(), pbase(), pptr(), epptr()) obtain the values
which rhs had. Whether they do or not, *this and rhs reference
separate buffers (if any at all) after the construction. The openmode,
locale and any other state of rhs is also copied.
类似的句子也用于basic_filebuf(basic_filebuf&& rhs);.
题
我想知道为什么这是实现定义?您是否有理由不想复制指针?
最佳答案 有两种明显的实现技术可以处理标准流缓冲区中的缓冲区:
>您可以将缓冲区嵌入到对象中,为对象创建更大的占用空间,但避免为小字符串或文件分配内存.
>您可以指向堆上分配的缓冲区,并以内存分配为代价处理可能较大的缓冲区.
根据缓冲区所在位置的实现选择,您需要一组新的指针值,或者您希望按原样继承指针.这两种策略都不是“更好”,我可以想象结合策略的变化.因此,而不是做出选择实现可以选择.如果你的问题是为什么实施应该[忘记]记录它做出的选择:这显然超出了我.我个人的猜测是,假设“实施定义”阶段将提供选择的自由,并且忽略了影响是实施需要陈述其选择(因为有关于引用的辩论:1.3.10) [defns.impl.defined] – 奇怪的是没有段落编号).