遇到一个优点意思的代码段:
#include <iostream>
#include <fstream>
std::ofstream make_stream(){
std::ofstream out;
std::cout.fill ('*');
std::cout.width (20);
out.copyfmt(std::cout); //如函数名所表达的,只拷贝“格式化设定”信息,如填充字符,补充宽度等
out.clear(std::cout.rdstate()); // 复制 rdstate
out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // 共享缓冲
return out;
}
int main() {
make_stream() << "Hello, world\n";
}
返回一个ofstream对象,是否意味着拷贝一个文件输出流对象?流对象的拷贝意味着什么?考虑操作系统的文件,读写文件涉及到缓冲区刷新和偏移量变化等问题。ofstream对象可以理解为封装了文件句柄(我们通过操作系统的文件句柄访问文件)的东西,当我们由ofstream a拷贝出另一个ofstream b=a;如果设计成共享相同的文件句柄,则面临状态变化同步的难题。如果设计成b重新打开一个文件,则明显与拷贝语义不符。所以最终设计决策是,流不能拷贝。
代码段中的返回临时对象ofsteam是否意味着拷贝呢?实际上C++11开始,支持move copy,move语义有转移所有权的意思。函数内的那个std::ofstream out对象被掏空了。
这段代码还告诉我们另一个意思,如果要复制一个流,只需要复制三个东西:格式化设置,错误状态位,流缓冲。