编译器如何选择正确的函数

How does the compiler choose the right function?

本文关键字:函数 选择 何选择 编译器      更新时间:2023-10-16

我写了一个小的3d矢量类。特别地,我写了两个函数,一个用于旋转向量,另一个用于返回向量本身的旋转副本。所以我有以下内容:

Vector Vector::Rotate(const double angle, Vector& axis) const {
Vector b=*this;
b.Rotate(angle,axis);
return (b);
}
void Vector::Rotate(const double angle, Vector & axis) {
/* let's promote this vector to a quaternion */
Quaternion V (0,*this);
/* quaternion describing the rotation */
Quaternion q (cos(angle/2),axis*sin(angle/2));
/* actual rotation  */
*this = (q*V*q.conjugate()).Vec();
}

现在,当我写这样的东西:

 vector2 = vector1.Rotate(rbo::M_PUCKER,i);

我得到错误:没有运算符"="匹配这些操作数操作数类型为:Vector = void

我希望编译器理解我想要的:为什么他选择void版本而不是另一个返回一个向量?此外,像我这样为相同的函数编写更多版本是一种很好的实践吗?

编译器仅根据调用成员函数的对象选择const或非const重载。如果对象(或引用)是const,它将选择const过载。

这是良好的实践吗?不。从您对编译器应该做什么感到困惑的事实来看,这似乎很明显。通常,编写易于阅读和解释而不会混淆的代码是一种良好的实践:)

返回类型不参与重载解析。换句话说,你不能有只在返回类型上不同的函数。

我认为你的代码只能编译,因为其中一个函数是"const"。

如果vector1不是const,它将选择

void Vector::Rotate(const double angle, Vector & axis)

对于成员函数,有一个隐藏参数this

Vector Vector::Rotate(const double angle, Vector& axis) const 
//actually is 
Vector Rotate(const Vector const * this,const double angle, Vector& axis) const 
void Vector::Rotate(const double angle, Vector & axis) 
//actually is 
void Rotate(Vector const * this,const double angle, Vector& axis) 

对象vector1的指针是vector *

我猜编译器会选择最匹配的一个