我在foo类中写了隐式强制转换运算符来加倍,而显式强制转换运算符则把int用作参数。尽管使用未强制转换的foo对象代码进行了调用,但该代码仍被执行。
我使用了gcc PRETTY_FUNCTION ,发现foo对象被强制转换为两倍,然后转换为int。
int
我希望由于显式运算符而不会编译它,但是它确实可以编译,并且将0打印为int(1/2)。
程序输出为: foo :: operator double() 0
答案 0 :(得分:10)
来自cppreference:
隐式转换序列按以下顺序组成:
1)零或一个标准转换序列;
2)零或一次用户定义的转换;
3)零个或一个标准转换序列。
因此,您的foo
可以转换为double
(2),然后double
可以转换为int
(3)。
如果您不想编译代码,则还必须进行double
转换explicit
。 explicit
仅阻止您的foo
仅在步骤2中转换为int
,但是在整个序列中,转换仍然可以隐式完成。隐式转换可能很棘手,因为(1)和(3),一个用户提供的隐式转换(2)可能会带来意想不到的副作用。
答案 1 :(得分:0)
当然,它将使用double
转换运算符,然后将double
强制转换为int
。 double
转换运算符可以隐式调用。删除explicit
,它将不会首先投射到double
由于explicit operator int()
explicit