关于运算符重载,该怎么处理

关于运算符重载
struct S { S(int) { } /* … */ };
 
struct SS {
    int m;
    SS(int x) :m(x) { }
    // 因为结构体S中没有S(SS);不存在干扰
    operator S() { return S(m); }  
};
 
SS ss(1);
S s1 = ss;    // 正确;类似隐式构造函数
S s2(ss);    // 正确;类似隐式构造函数
void f(S);
f(ss);        // 正确;类似隐式构造函数


struct S { S(int) { } };
 
struct SS {
    int m;
    SS(int x) :m(x) { }
     
    // 因为结构体S中没有S(SS)(译注:因为结构体S中没有定义S(SS),
    // 无法将SS转换为S,所以只好在SS中定义一个返回S的转换操作符,
    // 将自己转换为S。转换动作,可以由目标类型S提供,也可以由源类型SS提供。)
     explicit operator S() { return S(m); } 
};
 
SS ss(1);
S s1 = ss;    // 错误;类似显式构造函数
S s2(ss);    // 正确;类似显式构造函数
void f(S);
f(ss);        // 错误;类似显式构造函数
}


上面那个operator S()没看懂是什么意思?怎么用啊这个?

s1=ss这个不是应该用S的赋值构造函数?S里没有啊。。。

s2(ss)这个不是应该用S的复制构造函数?S里也没有啊。。。

为什么第一个例子里f(ss)是对的啊。。。

谢谢

------解决方案--------------------
operator S() 这个是重载操作符(),返回的值类型为S

S s1 = ss;    // 正确;类似隐式构造函数
这个相当于S s1 = ss.operator(); 只不过被编译器隐式这样转换了。程序员自身没有这样写

第二处为啥不行了呢,因为加了explicit,必须显式调用,不允许编译器帮助隐式转换。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

operator S() 这个是重载操作符(),返回的值类型为S

S s1 = ss;    // 正确;类似隐式构造函数
这个相当于S s1 = ss.operator(); 只不过被编译器隐式这样转换了。程序员自身没有这样写

第二处为啥不行了呢,因为加了explicit,必须显式调用,不允许编译器帮助隐式转换。

返回值不都是在operator前面吗?不是应该这样:S operator()?

()这个运算符需要放在()前面,如果放到operator之前,编译这为S operator()是一个类定义。定义了一个operator的类.


其实LS的意思是
S s1 = ss;    // 正确;类似隐式构造函数
这个相当于

S s1 = (S)ss;

operator S()重载的是SS对S类型的转换
这样LZ应该明白了吧