3DCoat  3D-COAT 4.9.xx
3DCoat is the one application that has all the tools you need to take your 3D idea from a block of digital clay all the way to a production ready, fully textured organic or hard surface model.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Передача временного объекта по ссылке

Передача временного объекта по ссылке, которая не помечена модификатором "const", является ошибкой для компилятора GCC под Linux. Ссылка на объект, по которой не возвращается значение, должна быть "const". Например:

class PairF {
public:
PairF(float A, float B) : _A(A), _B(B) {}
float GetA() { return _A; }
float GetB() { return _B; }
private:
float _A, _B;
};
float CalcLengthSq(PairF &P) {
return P.GetA() * P.GetA() + P.GetB() * P.GetB();
}
void UseCalcLengthSq() {
float L = CalcLengthSq(PairF(1, 2));
}

При сборке под Linux это приводит к ошибке:

error: invalid initialization of non-const reference of type ‘PairF&’ from an rvalue of type ‘PairF’
error: in passing argument 1 of ‘float CalcLengthSq(PairF&)’

В сигнатуру вызываемой функции нужно добавить "const" к типу аргумента:

float CalcLengthSq(const PairF &P) {
...
}

Удобно принять правило, что все ссылки всегда являются "const" и они только принимают аргументы. А модифицируемые аргументы всегда передаются только через указатель.

В следствии необходимости добавления "const" к ссылкам, по которым передаются временные объекты, возникает новая ошибка в местах, где у аргумента вызывается метод, не модифицирующий его содержимое, однако не помеченный модификатором "const". Например, после добавления "const" к аргументу в сигнатуре "CalcLengthSq" возникнет новая ошибка:

error: passing ‘const PairF’ as ‘this’ argument of ‘float PairF::GetA()’ discards qualifiers

Методы класса "PairF", которые не модифицируют его содержимое, должны быть помечены "const", чтобы их можно было вызвать у "const" ссылки на объект:

class PairF {
...
float GetA() const { return _A; }
float GetB() const { return _B; }
...