无情的 GCC C++ 编译器

问题描述 投票:0回答:3

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++ gcc visual-c++
3个回答
15
投票

根据 C++ 标准,不能将右值绑定到非常量引用。然而,微软编译器有一个邪恶的扩展允许这样做。所以g++不接受你的程序是正确的。


8
投票

g++ 的抱怨是正确的,而微软在这一点上是错误的。 这段代码的问题是 checkPointIn 函数通过引用获取它的第二个参数,这意味着它必须获取一个左值(例如,一个变量,或一个取消引用的指针)。 然而,checkPointInside 中的代码传入了一个临时对象,它是一个右值。 由于历史原因,微软编译器允许这样做,尽管规范明确禁止这样做。 通常,如果您在 Microsoft 编译器中将警告级别一路调高,它确实会将此代码标记为错误。

要解决此问题,请让 checkPointIn 按值或常量引用获取最后一个参数。 后者可能是更好的选择,因为 const 引用可以在必要时绑定到右值,并避免在其他情况下进行昂贵的复制。


4
投票

您无法创建对临时变量的引用(仅适用于 C++0x 中的常量引用或右值引用)。

当您使用

checkPoint
作为第二个参数调用
CIwVec2()
时,就会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.