这个例子来自“Thinking in C ++”,我有一个关于编译器合成运算符转换函数的问题。
问题
当传递类4的对象时(在函数调用f()中),调用重载操作()。但是我无法通过编译器弄清楚所使用的逻辑(编译器合成操作调用)来实现这种转换。
在max,我可以期待明确的转换行为,比如
1. obj3 =(三)obj4;
2. obj3 =三(obj4);
3. obj3 = static_cast <Three
&gt; (OBJ4);
现在进行上述任何一种转换 - 编译器如何合成,
(三)obj4.operator()?
可能是我遗漏了一些重点。
示例
//: C12:Opconv.cpp
// Op overloading conversion
class Three {
int i;
public:
Three(int ii = 0, int = 0) : i(ii) {}
};
class Four {
int x;
public:
Four(int xx) : x(xx) {}
operator Three() const { return Three(x); }
};
void g(Three) {}
int main() {
Four four(1);
g(four);
g(1); // Calls Three(1,0)
} ///:~
答案 0 :(得分:1)
首先,它不是您提供的operator()
,而是operator Three
。此运算符告诉编译器如何将class Four
的对象转换为class Three
的对象。在g(four)
中,调用编译器正在使用此运算符,因为函数g
期望类型为Three
的参数。由于存在转换,因此编译器正在使用它。在第二种情况下,由于Three
的构造函数未声明为explicit
,因此可以使用单个整数构造class Three
的对象(使用Three
构造函数)编译器正在使用该构造函数创建class Three
的对象,以便可以调用函数g
。
答案 1 :(得分:0)
首先,class Four
不包含operator()
,但它有一个operator Three()
,它是一个转换运算符。
在第
行g(four);
编译器需要将four
转换为class Three
的对象,并合成对operator Three()
的调用以执行该转换。
合成转换相当于
g(four.operator Three());