返回类型取决于算术运算中的顺序.这是对的吗?

Art*_*zuk 4 c++

请考虑以下代码段:

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.

我的理解是否正确?或者是否有针对这种情况的其他规则?

krz*_*zaq 6

你的理解是有缺陷的.您将二进制定义operator+为成员函数.这意味着任务的左手是一成不变的.为了DR它的DR分别.

d+r本质上是一样的东西d.operator+(r),这对于Un<D>回报D.反过来也是一样的r+d.

在两个表达式中,您都"创建"左操作数.正确的是两者都转换了.