Неумолимый компилятор GCC C ++ - PullRequest
0 голосов
/ 17 февраля 2011

Компилятор 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;
}; 

Ответы [ 3 ]

15 голосов
/ 17 февраля 2011

Согласно стандарту C ++, вы не можете привязать значение к неконстантной ссылке.Однако компилятор Microsoft имеет злое расширение, которое позволяет это.Так что g ++ правильно не принимать вашу программу.

8 голосов
/ 17 февраля 2011

g ++ - это право жаловаться, а Microsoft ошибается.Проблема с этим кодом заключается в том, что функция checkPointIn получает второй параметр по ссылке, что означает, что он должен принимать lvalue (например, переменную или разыменованный указатель).Однако код в checkPointInside передает временный объект, который является значением.По историческим причинам компилятор Microsoft допускает это, хотя это явно запрещено спецификацией.Обычно, если вы поднимаете уровень предупреждения до конца в компиляторе Microsoft, он действительно помечает этот код как ошибочный.

Чтобы это исправить, либо у checkPointIn должен быть последний аргумент по значению или по константной ссылке.Последнее, вероятно, является лучшим выбором, поскольку ссылки на const могут связываться с rvalues, если это необходимо, и избегать создания дорогостоящих копий в других случаях.

4 голосов
/ 17 февраля 2011

Нельзя создавать ссылки на временные ссылки (только ссылки на константы или ссылки на r-значения в C ++ 0x).

Это происходит, когда вы вызываете checkPoint с CIwVec2() в качестве второго параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...