为何const std::istream无法与std::string执行>>操作?构造函数报错解析
错误原因与修复方案
核心问题
你遇到的Invalid operands to binary expression错误,本质是输入流的>>提取运算符会修改流的内部状态(比如移动读取指针、设置eof/fail等标志位),因此标准库中operator>>的左操作数要求是std::istream&(非const引用)。但你的构造函数参数是const std::istream& is——const限定的流对象无法调用任何会修改自身的成员函数或运算符,这就导致了类型不匹配的报错。
修复代码
只需将构造函数的输入流参数去掉const限定:
class Book { std::string m_title; std::string m_author; int m_noPages; public: Book(std::istream& is) { // 移除const修饰 std::string bookString; is >> bookString; // 后续拆分字符串到成员变量的逻辑... } };
补充说明
如果需要支持临时流对象(比如Book(std::istringstream("1984 George Orwell 328"))这类场景),可以将参数改为std::istream&&(右值引用),不过非const的左值引用已经能覆盖绝大多数常规输入场景(比如std::cin)。
内容的提问来源于stack exchange,提问作者Sebastian Rubina
相关产品推荐
相关产品推荐

