不可原谅的GCC C++编译器

Bil*_*ias 0 c++ compiler-construction gcc visual-c++

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;
}; 
Run Code Online (Sandbox Code Playgroud)

fre*_*low 15

根据C++标准,您不能将rvalue绑定到非const引用.但是,Microsoft编译器有一个邪恶的扩展,允许这样做.所以g ++不接受你的程序是正确的.

  • 他们称之为"扩展",但实际上这是一个错误. (5认同)

tem*_*def 8

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

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