我有以下功能(对于示例的情况进行了简化):
bool _move (class Square * const cpOldSquare, class Square * const cpNewSquare, const bool & rcOverride = false) {
if (rcOverride ? true :
(!!cpOldSquare->mupChesspiece
&& cpOldSquare->mupChesspiece->mcColour == _player
&& ISINSIDE(cpOldSquare->mupChesspiece->mContinuation.mrcvcpGetList(), cpNewSquare)))
// do something
现在,我从下面的代码中调用这个函数。我引入
rcOverride
bool 是为了优化 _move
函数,因为从逻辑上讲,从这个环境调用该函数时,if 语句的所有条件都满足,所以我不需要再次测试这些条件。
for (const auto * const & rcpcChesspiece : _chessboard.mPieces.mrcvcpGetList()) {
if (rcpcChesspiece->mcColour != _player) continue;
for (auto * const & rcpSquare : rcpcChesspiece->mContinuation.mrcvcpGetList())
if (_move(rcpcChesspiece->mpSquare, rcpSquare, true))
// do something
}
然而,我遇到了一个段错误,我已经能够查明该错误来自于第三个条件不真实(
ISINSIDE
宏,定义为#define ISINSIDE(x,y) (std::find(x.begin(), x.end(), y) != x.end())
)。
如果我删除
true
覆盖,程序将正常运行,允许它测试第三个条件,并且随后不运行 if 语句内的代码。
您可能不同意我处理此优化工作的方式,但看看所有变量,它们来自哪里(从逻辑上讲——看看第二个代码块中基于范围的 for 循环),我必须得出结论,他们应该表现得同等。
ISINSIDE
必须始终评估为 true
,对吧?你能看出行为差异从何而来吗?
打开样板,代码正在测试容器是否
rcpcChesspiece->mpSquare->mupChesspiece->mContinuation.mrcvcpGetList()
包含
rcpSquare
。凭借 range-for 循环,我们知道它应该包含在
rcpcChesspiece->mContinuation.mrcvcpGetList()
根据所提供的代码,没有足够的信息来断定这些容器必须始终相等,或者一个容器的成员始终是另一个容器的成员。