尽管显式强制将类变量隐式强制转换为int

时间:2019-05-16 18:49:41

标签: c++

我在foo类中写了隐式强制转换运算符来加倍,而显式强制转换运算符则把int用作参数。尽管使用未强制转换的foo对象代码进行了调用,但该代码仍被执行。

我使用了gcc PRETTY_FUNCTION ,发现foo对象被强制转换为两倍,然后转换为int。

int

我希望由于显式运算符而不会编译它,但是它确实可以编译,并且将0打印为int(1/2)。

程序输出为: foo :: operator double() 0

2 个答案:

答案 0 :(得分:10)

来自cppreference

  

隐式转换序列按以下顺序组成:

     

1)零或一个标准转换序列;

     

2)零或一次用户定义的转换;

     

3)零个或一个标准转换序列。

因此,您的foo可以转换为double(2),然后double可以转换为int(3)。

如果您不想编译代码,则还必须进行double转换explicitexplicit仅阻止您的foo仅在步骤2中转换为int,但是在整个序列中,转换仍然可以隐式完成。隐式转换可能很棘手,因为(1)和(3),一个用户提供的隐式转换(2)可能会带来意想不到的副作用。

答案 1 :(得分:0)

当然,它将使用double转换运算符,然后将double强制转换为intdouble转换运算符可以隐式调用。删除explicit,它将不会首先投射到double

由于explicit operator int()

,它无法使用explicit