带有重载r值参考函数的模糊调用

时间:2015-02-24 16:26:47

标签: c++ c++11 g++ ubuntu-14.04 rvalue-reference

我有一个包含以下声明的类:

class IcoSphere
{
[...]
private:
    int _addVertex(const glm::vec3 &p);
    int addVertex(glm::vec3 p);
    int addVertex(const glm::vec3 &&p);
[...]
};

然后,我这样称呼'addVertex':

IcoSphere sphere;
double t = (1.0 +sqrt(5.0)) /2.0;
sphere.addVertex(glm::vec3(-1,t,0));

'addVertex'的参数显然不是引用,但g ++ - 编译器抛出以下错误:

./network/icosphere.cpp: In static member function ‘static void IcoSphere::Create(glm::vec3&, float, std::vector<glm::tvec3<float, (glm::precision)0u> >&, int)’:
./network/icosphere.cpp:46:36: error: call of overloaded ‘addVertex(glm::vec3)’ is ambiguous
  sphere.addVertex(glm::vec3(-1,t,0));
                                    ^
./network/icosphere.cpp:46:36: note: candidates are:
./network/icosphere.cpp:19:5: note: int IcoSphere::addVertex(glm::vec3)
 int IcoSphere::addVertex(glm::vec3 p) {_addVertex(p);}
     ^
./network/icosphere.cpp:20:5: note: int IcoSphere::addVertex(const vec3&&)
 int IcoSphere::addVertex(const glm::vec3 &&p) {_addVertex(p);}
     ^

这对我来说没有多大意义,为什么它认为这是一个含糊不清的电话呢?

1 个答案:

答案 0 :(得分:2)

当编译器处理函数重载解析时,它首先得到所有可行的函数,然后对它们进行排序并调用排名最高的函数。

但是例如

type var;
void func(type);
void func(tpye&&);
func(var);

两种func方法都具有相同的排名。它们都完全匹配。不需要促销或隐式类型转换或任何其他内容。您的问题也是如此。 所以你可能想要改变

int addVertex(glm::vec3 p);

int addVertex(const glm::vec3& p);

因为你并不打算改变它。有关重载分辨率和右值参考重载分辨率的更多内容,http://www.dcs.bbk.ac.uk/~roger/cpp/week20.htmhttp://yapb-soc.blogspot.com/2015/01/rvalue-references-and-function.html