这个例子来自《Thinking in C++》,我有一个关于编译器综合运算符转换函数的问题。
问题
当传递类四的对象时(在函数调用 f() 中),重载操作 () 被调用。但是我无法弄清楚编译器使用的逻辑(编译器综合操作调用)来实现这种转换。
最多,我可以期待显式转换行为,比如
1. obj3 = (三)obj4;
2. obj3 = 三(obj4);
3. obj3 = static_cast <Three
> (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)
} ///:~
最佳答案
首先,您提供的不是operator()
,而是operator 3
。此运算符告诉编译器如何将 class Four
的对象转换为 class Three
的对象。在 g(four)
调用中,编译器使用此运算符,因为函数 g
需要一个类型为 Three
的参数。由于有可用的转换,编译器正在使用它。在第二种情况下,由于 Three
的构造函数未声明为 explicit
并且可以使用单个构造函数构造 class Three
的对象整数(使用 Three
构造函数)编译器使用该构造函数创建 Three 类
的对象,以便可以调用函数 g
。
关于C++ 运算符重载合成转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584614/