о const в определении перегрузки оператора - PullRequest
0 голосов
/ 12 октября 2011

Для следующего определения

const vector3F operator*(const vector3F &v, float s);

Есть два const, каковы их соответствующие использования?

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Const-ссылка в аргументе означает, что вы не изменили v, поэтому вы можете передавать постоянные векторы (и временные значения!) В функцию.Это хорошо.

Постоянный возврат по значению является своего рода трюком.Это не позволяет вам писать что-то вроде этого:

 vector3F v = get_vector();
 vector3F w = v;

 (v * 1.5) = w; // outch! Cannot assign to constant, though, so we're good.

Возврат значения-значения в виде константы проблематичен, поскольку он мешает ссылочным значениям в C ++ 11 и семантике перемещения:

 move_me(v * 1.5);  // cannot bind to `vector3F &&` :-(

Из-за этого и из-за того, что злоупотребление, подобное тому, которое я показал выше, довольно маловероятно, случайно произойдет, вероятно, лучше возвращать значение только как непостоянное.

0 голосов
/ 12 октября 2011

Первый констант указывает, что возвращаемое значение является постоянным и не может быть изменено (что, кстати, является плохой идеей для оператора умножения):

const Vector3F v = myvector*100.0;

v.x = 0; // error: the vector is constant and can not be altered

Второй констант указывает, чтоаргумент "v" является константой:

const vector3F operator*(const vector3F &v, float s)
{
    v.x = 0; // error: "v" is constant
}
...