2011-10-12 74 views

回答

4

参数中的常量引用意味着您不会更改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

不会返回const值也会阻止这种用法'somevar =(v * 1.5)* w;'? – RedX

+0

@RedX:如果允许您从常量中复制,则不适用。 –

0

第一常量表示该返回值是恒定的,并且不能被改变(它,顺便说一下,为乘法运算符未尝):

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 
} 
+1

第一个示例中的错误来自'v'声明中的'const'。不要改变'operator *',整个事情就会编译得很好。 –

+0

是的,这是一个坏主意(请参阅Kerrek SB的答案),但不是因为这个原因。 – UncleBens