编译器如何选择正确的函数
How does the compiler choose the right function?
我写了一个小的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 *
我猜编译器会选择最匹配的一个
相关文章:
- 选择要调用的构造函数
- 无法获取菜单选择以运行函数.C++
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- LLVM 选择找不到函数传递
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 如何在"push_*()"和"emplace_*()"函数之间进行选择?
- 如何在字符函数中选择某些字符?
- OpenCL 内置函数选择
- 编译时构造函数选择
- 内联函数选择条件
- c - 函数选择显示读取后stdin中有数据
- Clang 和 GCC 在使用大括号表示法和initializer_list时在构造函数选择上存在分歧
- 最小化函数选择和函数调用开销
- 当参数是引用时,可变模板构造函数选择失败
- 在运行时为调用函数选择对象,不包含基类和模板
- 为什么const临时函数选择调用非const成员函数而不是const成员函数?
- 如何消除构造函数选择的强制转换
- 是否有可能编写一个抽象类,其中构造函数选择适当的子类在c++中实例化
- c++模板函数选择
- vector insert中重载模板函数选择(模式匹配)是如何工作的