如何将cout赋值给ostream类对象?为何改用引用可解决编译报错?
关于std::ostream对象赋值的问题
问题场景
执行以下代码:
std::ostream a = std::cout;
编译器抛出错误:
"std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits> &) [with _CharT=char, _Traits=std::char_traits
]" (declared at line 404 of "/usr/include/c++/11/ostream") is inaccessible
解决方法:用引用或指针关联std::cout
要关联std::cout到另一个可操作的ostream类型标识,不能直接拷贝对象,而是用引用或者指针:
- 引用方式(最常用):
std::ostream& a = std::cout; // 使用时和cout完全一致,比如 a << "Hello World";
- 指针方式:
std::ostream* a = &std::cout; // 使用时需用指针操作符,比如 *a << "Hello World"; 或者 a->write("test",4);
为什么引用方式能解决错误?
报错的核心原因是:C++标准规定所有标准流类(包括std::ostream)的拷贝构造函数被禁用(声明为私有/受保护)。
当你写std::ostream a = std::cout;时,编译器会尝试调用std::ostream的拷贝构造函数,把std::cout的内容拷贝到新对象a中,但这个构造函数是不可访问的,因此触发错误。
而引用std::ostream& a = std::cout;并不会创建新的ostream对象,它只是给已存在的std::cout对象起了一个别名,完全不需要调用拷贝构造函数,自然就不会触发这个错误。
流类禁用拷贝的底层逻辑是:流对象和底层IO资源(比如控制台、文件句柄)绑定,拷贝流对象会导致同一资源被多个对象管理,引发资源冲突、重复释放等问题,所以C++标准直接禁止了流对象的拷贝操作。
内容的提问来源于stack exchange,提问作者Bojack Horseman
相关产品推荐
相关产品推荐

