C++11 §27.5.4.2/21:
这种局部交换有什么用处?
会引起问题吗?
void swap(basic_ios& rhs);
作用: 除了rdbuf()和rhs.rdbuf(),交换*this和rhs的状态。这种局部交换有什么用处?
会引起问题吗?
一个类似的操作也用于移动构造和移动赋值操作。由于基类是虚拟基类,因此其构造函数不会被最直接派生的类调用,移动构造变得更加复杂。
这很有趣。看起来很奇怪。但最终它能够正常工作。;-)
稍作修正:
Alberto Ganesh Barbati 负责保护 swap
在 i/ostream
级别上。他的决定非常正确,而我在最初设计中完全忽略了它。
basic_streambuf
中加入一个虚拟交换函数呢? - Xeochar buffer[50]
数据成员),那么这个规定是必要的,因为显然缓冲区的内容可能会被交换,但它们的地址不会改变。
我不知道是否实际上允许这样做。rdbuf
函数替换缓冲区。 - Cheers and hth. - Alfbasic_streambuf<charT, traits>
类型的对象,或者是派生自该类型。可以通过stream.rdbuf(pMyNewBuffer)
进行替换。basic_ios
析构函数的文档中说明不会销毁rdbuf()
对象,因此完全可以将该对象作为直接成员,但类仍必须支持更改rdbuf()
指针。 - Cheers and hth. - Alfstruct S { char buffer[64]; char* ptr; };
,原始情况下ptr
指向buffer
,这样可以在仍然有内部缓冲区的情况下更改ptr
。 - Matthieu M.rdbuf
接受shared_ptr
(或unique_ptr
)而不是缓冲区已经太晚了。这将非常有用,因为您可以获得生命周期管理而无需进行动态分配。 - Steve Jessop
rdbuf
,我会认为这是一个实现错误。 - GManNickGswap
与移动赋值“不一致”?或者将流移动会留下缓冲区吗?如果不一致,那么在通用代码中,如果有人假设对于任何类型T
,swap(t1,t2)
的最终结果与T t3(move(t1)); t1 = move(t2); t2 = move(t3);
的最终结果相同,则可能会出现潜在问题。 - Steve Jessop