重载operator<<为何能直接接收enum class类型参数?
为什么enum class类型能匹配接收coutColor参数的operator<<?
核心原因是你的coutColor类里存在一个非explicit的构造函数,这个构造函数的参数正好是color枚举类类型。
在C++中,当构造函数没有被explicit关键字修饰时,编译器会自动触发隐式类型转换:它会把传入的color::red(枚举类实例)当作参数,调用这个构造函数生成一个临时的coutColor对象,这个临时对象就能匹配到你重载的operator<<(ostream&, const coutColor&)函数,所以直接用color::red也能生效。
举个对应你场景的简化示例:
enum class color { red, green }; class coutColor { public: // 非explicit构造函数,允许隐式转换 coutColor(color c) : col(c) {} private: color col; }; ostream& operator<<(ostream& os, const coutColor& cc) { // 控制台着色逻辑 return os; } // 调用时,cout << color::red; 会被隐式转换为 cout << coutColor(color::red);
如果想禁止这种隐式转换,只需要给构造函数加上explicit关键字:
explicit coutColor(color c) : col(c) {}
此时再写cout << color::red;就会编译报错,必须显式构造coutColor(color::red)才能使用。
内容的提问来源于stack exchange,提问作者Kuvaitt
相关产品推荐
相关产品推荐

