我的代码看起来像这样
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。
答案 0 :(得分:7)
它使用operator==
,因为它是在operator!=
中调用的。
它仅使用 operator==
,因为operator!=
可能是inlined,
代替执行函数调用CPU指令以将控制转移到函数体,而不执行调用而执行函数体的副本。
如果是这样的话你就不会看到调用。
值得注意的是,函数内联与否取决于编译器;它不能保证。
由于关键字
inline
的含义是非绑定的,编译器可以自由地对未标记为内联的任何函数使用内联替换,并且可以自由地生成对内联标记的任何函数的函数调用。