为何C++类对象赋值int时未调用转换运算符?
问题解析:为什么
c=1不调用operator int&()? 首先得搞清楚c = 1这个赋值操作的核心逻辑:
- 这个表达式等价于调用
c.operator=(1),编译器会优先查找C类中接受int作为参数的赋值运算符(也就是C& operator=(int)),而你的代码里并没有定义这个函数。 - 接下来编译器会尝试把右边的
int值1转换成C类型对象,再调用默认的赋值运算符C& operator=(const C&)。但你的构造函数explicit C(int)带了explicit关键字,禁止隐式转换,所以1无法自动转成C临时对象,最终导致没有匹配的赋值运算符,触发编译错误。
那为什么你预想的operator int&()没被调用?因为转换运算符的作用是把C对象转换成int&,但这和当前赋值操作的需求完全相反:
- 你现在是要给
C对象c赋值,不是要把c转成int后给int变量赋值。如果是int x = c;这种场景,编译器才会调用operator int&()把c转成int类型。
为什么去掉explicit就可以?
去掉构造函数的explicit关键字后,int可以隐式转换成C临时对象,此时c = 1就等价于c = C(1),默认的赋值运算符C& operator=(const C&)就能匹配上,编译自然通过。
举个例子验证转换运算符的正确用法:
struct C { explicit C(int); operator int&() { static int x = 0; return x; } }; int main() { C c({}); int x = c; // 这里会调用operator int&(),完全合法 // c = 1; 还是报错,因为赋值方向不匹配 }
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

