c++ - 返回类型取决于算术运算的顺序。这是正确的吗?

标签 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;
    }
};

用法如下:

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+作为成员函数。这意味着作业的左手是一成不变的。对于 DR这是DR , 分别。

d+r本质上与 d.operator+(r) 相同, 这对于 Un<D>返回 D . r+d 反过来也是一样的.

在这两个表达式中,您都“创建”了左操作数。正确的确实在两者中都转换了。

关于c++ - 返回类型取决于算术运算的顺序。这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40278476/

相关文章:

c++ - 从 istringstream 获取带后缀的 long long (C++)

c++ - 一个 hdf5 文件中有多少个数据集

c++ - 如何创建自己的 ostream/streambuf?

c++ - 调整大小时数组 "breaks"

c++ - String 到 char * 特殊字符的转换

c++ - 删除 Tesseract 中的处理日志

c++ - vector<float> 写入文件

c++ - 如何安装 Windows 10 SDK 以用于 Visual Studio 2017

C++ - 从另一个 Wave 文件创建一个 Wave (.Wav) 文件,但带有自定义 header

C++:不能调用没有对象的成员函数