关于操作符重载定义中的const

about the const in an operator overloading definition

本文关键字:const 定义 重载 操作符      更新时间:2023-10-16

对于

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

有两个const,它们各自的用法是什么?

参数中的const-reference意味着您不更改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 &&` :-(

由于这个原因,并且因为像我上面展示的那样的滥用是不太可能偶然发生的,所以可能最好只按值返回非常量

第一个const表示返回值是常量,不能更改(顺便说一下,这对于乘法操作符来说不是一个好主意):

const Vector3F v = myvector*100.0;
v.x = 0; // error: the vector is constant and can not be altered

第二个const表示实参"v"是常量:

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