4

从我的 C++ 标准副本 [§27.8.2.1p4]:

basic_stringbuf(basic_stringbuf&& rhs);

效果:从右值 rhs 移动构造。*this (eback(), gptr(), egptr(), pbase(), pptr(), epptr()) 中的序列指针是否获得rhs 所具有的值是实现定义的。无论他们是否这样做,*this 和 rhs 在构造之后都会引用单独的缓冲区(如果有的话)。rhs 的 openmode、locale 和任何其他状态也会被复制。

类似的句子也用于basic_filebuf(basic_filebuf&& rhs);

问题

我想知道为什么这是实现定义的?您是否有理由不想复制指针?

4

1 回答 1

2

有两种明显的实现技术来处理标准流缓冲区中的缓冲区:

  1. 您可以将缓冲区嵌入到对象中,为对象创建更大的占用空间,但避免为小字符串或文件分配内存。
  2. 您可以指向在堆上分配的缓冲区并以内存分配为代价来处理可能很大的缓冲区。

根据缓冲区所在位置的实现选择,您将需要一组新的指针值,或者您希望按原样继承指针。这两种策略都不是“更好”的,我也可以想象结合这些策略的变化。因此,实现可以选择而不是做出选择。如果您的问题是为什么实施应该[忘记]记录它所做的选择:这显然超出了我的范围。我个人的猜测是,假设“是实现定义的”阶段将提供选择的自由,并且忽略了实现需要说明其选择的含义(因为对引用进行了辩论:1.3.10 [defns.impl.defined] - 奇怪的是没有段落编号)。

于 2012-11-02T22:48:13.253 回答