为什么basic_stringbuf和basic_filebuf move构造函数具有实现定义的行为? 从我的C++标准的拷贝[第27.82.1P4]:

为什么basic_stringbuf和basic_filebuf move构造函数具有实现定义的行为? 从我的C++标准的拷贝[第27.82.1P4]:,c++,c++11,iostream,C++,C++11,Iostream,基本型(基本型和右型) 效果:从右值rhs移动构件

基本型(基本型和右型)

效果:从右值rhs移动构件<是的 实现定义了*中的序列指针是否 (eback()、gptr()、egptr()、pbase()、pptr()、epptr())获取值 哪些rhs拥有。无论他们是否这样做,*此和rhs参考 施工后,分离缓冲区(如有)。openmode, 还将复制rhs的区域设置和任何其他状态

类似的句子也用于
basic\u filebuf(basic\u filebuf&&rhs)

问题


我想知道为什么要定义这个实现?您不想通过指针进行复制有什么原因吗?

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

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

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

    大约有50个非常聪明的人聚在一起讨论这件事,但没有人同意。我不想在这件事上出丑,但是。。。断章取义please@LightnessRacesinOrbit当前位置我认为缺少章节并不重要。。。这是对
    basic\u stringbuf
    的move构造函数的要求,这一点已经足够详细了。如果您不想搜索文档,请参见§27.8.2.1p4“实施定义”当现有实施已经不同时,委员会通常会指定“实施定义”行为,也没有很好的理由强迫他们都遵守特定的行为。@LightnessRacesinOrbit:引用本章的另一种方式是通过右边的注释[stringbuf.cons],其中定义了
    stringbuf
    的构造函数。我同意在科学中你需要提供精确的引用,但在这种情况下,文档是已知的(标准),并且文档的组织足够清晰,只需几秒钟就可以找到引用。谢谢,我想我现在明白了。如果没有在堆上分配缓冲区,那么唯一可以做的就是复制,在这种情况下,您需要一组新的指针值。对的