过载==和!=,但是程序仅使用前者

Overloading == and !=, but program only use the former

本文关键字:程序 过载      更新时间:2023-10-16

我的代码看起来像

template <typename T>
class FArray
{
/* ... */
    inline bool operator == (const FArray& b) const
    {
        return std::equal(begin(),end(),b.begin());
    }
    inline bool operator != (const FArray& b) const
    {
        return !(*this == b);
    }
};

然后我有一些单位测试,我正在测试平等和不等式

FArray<double> a, b, c;
/* ... */
ASSERT_TRUE(a == b)
ASSERT_TRUE(a != c)

第二个断言不使用过载的运算符!=,它仅使用==,我认为返回其否定(我在重载函数中添加了一个断点,我的程序不会贯穿它(。但是,如果我不超载一个或另一个,我就无法编译。是标准行为吗?我找不到有关此在线的任何相关信息。

我正在使用Visual Studio 2017 15.5.6,带有Visual C 2017-00369-60000-00001-AA639。

使用operator==,因为它在operator!=中调用。

它使用 operator==,因为 operator!=可能会被夹住,

而不是执行函数呼叫CPU指令将控件传输到功能主体,而是执行功能体的副本而无需生成呼叫。

,如果是这种情况,您将不会看到调用。

也值得注意的是,该函数是内衬的还是不取决于编译器;不能保证。

由于关键字inline的这种含义是非绑定的,因此编译器可以免费使用内联替换为未标记内联标记的函数,并且可以自由地为标记为内联函数的任何函数生成函数调用。