MS VS x86 编译器对以下定义没有问题,但 GCC (ARM) 抱怨。是 GCC 愚蠢还是 MSVS_x86 太聪明?
bool checkPointInside(const CIwVec2& globalPoint) {
return checkPointIn(globalPoint, CIwVec2());
}; /// error: no matching function for call to 'Fair::Sprite::checkPointIn(const CIwVec2&, CIwVec2)'
bool checkPointIn(const CIwVec2& globalPoint, CIwVec2& localPoint) {
return false;
};
根据 C++ 标准,不能将右值绑定到非常量引用。然而,微软编译器有一个邪恶的扩展允许这样做。所以g++不接受你的程序是正确的。
g++ 的抱怨是正确的,而微软在这一点上是错误的。 这段代码的问题是 checkPointIn 函数通过引用获取它的第二个参数,这意味着它必须获取一个左值(例如,一个变量,或一个取消引用的指针)。 然而,checkPointInside 中的代码传入了一个临时对象,它是一个右值。 由于历史原因,微软编译器允许这样做,尽管规范明确禁止这样做。 通常,如果您在 Microsoft 编译器中将警告级别一路调高,它确实会将此代码标记为错误。
要解决此问题,请让 checkPointIn 按值或常量引用获取最后一个参数。 后者可能是更好的选择,因为 const 引用可以在必要时绑定到右值,并避免在其他情况下进行昂贵的复制。
您无法创建对临时变量的引用(仅适用于 C++0x 中的常量引用或右值引用)。
当您使用
checkPoint
作为第二个参数调用 CIwVec2()
时,就会发生这种情况。