重载==和!=,但程序只使用前者

时间:2018-02-27 14:40:13

标签: c++ visual-studio-2017 inline

我的代码看起来像这样

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)

第二个断言没有使用重载的运算符!=,它只使用==,我认为返回它的否定(我在重载函数中添加了断点,我的程序没有&#39}经过它)。但是,如果我不重载其中一个,我就无法编译。这是标准行为吗?我无法在网上找到任何相关信息。

我使用Visual Studio 2017 15.5.6,使用Visual C ++ 2017 - 00369-60000-00001-AA639。

1 个答案:

答案 0 :(得分:7)

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

它仅使用 operator==,因为operator!=可能是inlined

  

代替执行函数调用CPU指令以将控制转移到函数体,而不执行调用而执行函数体的副本。

如果是这样的话你就不会看到调用。

值得注意的是,函数内联与否取决于编译器;它不能保证。

  

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