请考虑以下代码段:
template <typename U>
struct Un {
Un (int p) : n {p} {}
U operator+ (U v) const {
return U {n + v.n};
}
int n {};
};
struct R : Un<R> {
using Un::Un;
};
struct D : Un<D> {
using Un::Un;
D (R v) : Un {v.n} {}
operator R () const {
return n;
}
};
Run Code Online (Sandbox Code Playgroud)
用法如下:
template <typename T>
void what_type (T t) {
std::cout << "type R = " << std::is_same<T, R>::value << std::endl;
std::cout << "type D = " << std::is_same<T, D>::value << std::endl;
}
R r {10};
D d {10};
what_type (r+d);
what_type (d+r);
Run Code Online (Sandbox Code Playgroud)
输出是:
type R = 1
type D = 0
type R = 0
type D = 1
Run Code Online (Sandbox Code Playgroud)
这意味着如果算术表达式R类型作为第一个出现,则整个表达式是类型R,如果D首先出现类型,则表达式是类型D.
所以,我的理解是这样的:
在r+d首先我们创建的对象R类型,那么对象D类型,因为D已经operator R()实施,D对象转换为R,这让我们其实r+r.
在d+r首先我们创建的对象D类型,那么对象R类型,因为D具有构造这需要R反对它创建D从先前创建的对象r,这让我们其实d+d.
我的理解是否正确?或者是否有针对这种情况的其他规则?
你的理解是有缺陷的.您将二进制定义operator+为成员函数.这意味着任务的左手是一成不变的.为了D和R它的D和R分别.
d+r本质上是一样的东西d.operator+(r),这对于Un<D>回报D.反过来也是一样的r+d.
在两个表达式中,您都"创建"左操作数.正确的是两者都转换了.
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |