在下面的代码段中
#include <iostream>
class A
{
public:
A(int i) : m_i(i) { }
public:
int operator()(int i = 0) const
{
return m_i + i;
}
operator int () const
{
return m_i;
}
operator float () const
{
return 0.0;
}
private:
int m_i;
friend int g(const A&);
};
int f(char c)
{
return c;
}
int g(const A& a)
{
return a.m_i;
}
int main()
{
A f(2), g(3);
int i = f;// call 1
std::cout << f(1) << g(f) << std::endl;// call 2
return 0;
}
我给了一些评论,比如在主函数中调用1和调用2。 我理解为什么在调用1 时调用operator int。 但是我无法理解为什么在//呼叫2 有些人可以解释一下为什么会这样。
答案 0 :(得分:2)
函数g在范围内由g(类型A)隐藏。所以g(f)将f转换为int,然后使用转换结果调用g.operator()(int)。
答案 1 :(得分:1)
当你调用g(f)时,为g调用A :: operator()(int i = 0)。
因此必须将f转换为int,这是通过A :: operator int()。
完成的答案 2 :(得分:0)
std::cout << f(1) << g(f) << std::endl;
让我们将其分解为函数调用而不是运算符。 (这可能不是技术上正确的语法。)
int temp1 = f.operator()(1);
ostream& temp2 = std::cout.operator<<(temp1);
// By the implementation of ostream::operator<<, temp2 is a reference to std::cout.
// The compiler doesn't know this, though, and must treat it as if it could be different.
int temp3 = f.operator int(); // Typecast since A::operator() expects an `int`.
int temp4 = g.operator()(temp3);
ostream& temp5 = temp2.operator<<(temp4);
// temp5 is another reference to std::cout.
temp5.operator<<(std::endl);
// Result discarded.