考虑以下代码片段:
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;
}
};
用法如下:
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);
输出是:
type R = 1
type D = 0
type R = 0
type D = 1
这意味着如果在算术表达式中 R
类型出现在第一个,则整个表达式的类型为 R
并且如果 D
类型首先出现,然后表达式的类型为 D
。
所以,我的理解是这样的:
在r+d
中我们首先创建R
类型的对象,然后是D
类型的对象,因为D
实现了 operator R()
,D
对象被转换为 R
,这实际上给了我们 r+r
。
在d+r
中,我们首先创建了D
类型的对象,然后是R
类型的对象,因为D
> 有一个构造函数,它接受 R
对象,它从之前创建的 r
中创建 D
对象,这实际上给了我们 d+d
.
我的理解对吗?或者对于这种情况还有其他规则吗?
最佳答案
你的理解有问题。您定义了二进制 operator+
作为成员函数。这意味着作业的左手是一成不变的。对于 D
和 R
这是D
和 R
, 分别。
d+r
本质上与 d.operator+(r)
相同, 这对于 Un<D>
返回 D
. r+d
反过来也是一样的.
在这两个表达式中,您都“创建”了左操作数。正确的确实在两者中都转换了。
关于c++ - 返回类型取决于算术运算的顺序。这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40278476/