C2280 尝试引用已删除的函数

案例

ostream istream等基类为保护类型,是不可以拷贝构造的,所以我们可以使函数返回此基类的引用

  • 代码示例
ostream& operator<<(ostream& out, MyInteger& myint) {
	out << myint.m_Num;
	return out;
}

尝试引用已删除(被禁用)的函数

iostream 里的很多类(比如 ostream, istream)删除了拷贝构造函数和赋值运算符,原因是流对象(cout、cin)背后有文件句柄、缓冲区、状态等资源,拷贝一份会出错,所以标准库作者干脆禁止拷贝

为何返回引用

上述代码的重载返回了ostream&,而不是返回一个 ostream 对象。
如果你写成 ostream operator<<(ostream out, MyInteger& myint)那就会发生拷贝,因为传值参数要调用拷贝构造,但拷贝构造被删除,所以报 C2280
正确做法是传引用(避免拷贝)并返回引用(允许链式调用)

posted @ 2024-05-19 13:44  BreadCheese  阅读(187)  评论(0)    收藏  举报