c++ - 右值和左值的重载函数

标签 c++ c++11 overloading rvalue

我正在编写一个使用共享指针构建复杂节点结构的库。由于结构中可能存在循环,并且为了避免内存泄漏,我决定在构建结构时采用以下策略:每当我传递一个临时对象时,我使用一个 shared_ptr(获得所有权);每当我传递一个左值时,我都会使用 weak_ptr。根据我的分析和库界面的设计方式,这应该完全避免循环。

但是,我在使用函数重载来理解参数是右值还是左值时遇到了问题。这是我得到的错误的一个非常简单的例子:

#include <iostream>
#include <memory>

using namespace std;

class MyClass {
public:
    int a;
    // this class contains some pointers to the node structure
};

MyClass fun(MyClass &&x, MyClass &&y)
{
    // should produce an object that has ownership of the two others
}

MyClass fun(MyClass x, MyClass y)
{
    // should not take ownership, but just copy the pointer
}

int main()
{
    MyClass x, y;

    fun(x, y);
    fun(MyClass(), MyClass());
}

使用 g++ 4.8.2 编译时出现以下错误:

example.cpp: In function ‘int main()’:
example.cpp:29:29: error: call of overloaded ‘fun(MyClass, MyClass)’ is ambiguous
     fun(MyClass(), MyClass());
                             ^
example.cpp:29:29: note: candidates are:
example.cpp:12:9: note: MyClass fun(MyClass&&, MyClass&&)
 MyClass fun(MyClass &&x, MyClass &&y)
         ^
example.cpp:18:9: note: MyClass fun(MyClass, MyClass)
 MyClass fun(MyClass x, MyClass y)
         ^

因此,显然编译器无法区分这两个调用。我认为右值函数优先于传值函数,但显然我错了。

另外:我不能声明函数接受 const 引用,因为我只想获得所有权然后随意修改对象,所以引用不应该是常量。

关于如何解决这个问题有什么想法吗?

最佳答案

改变:

MyClass fun(MyClass x, MyClass y)
MyClass fun(MyClass&& x, MyClass&& y)

收件人:

MyClass fun(MyClass& x, MyClass& y)      // for lvalues
MyClass fun(MyClass&& x, MyClass&& y)    // for rvalues

在您的原始示例中,临时 MyClass 可以绑定(bind)到一个值或一个右值引用(两者都是完全匹配的)。但有了变化,就没有歧义了。

关于c++ - 右值和左值的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237032/

相关文章:

c++ - 丢弃限定符未知原因 (std::bind()/lambda)

c++ - 可变参数模板,没有匹配的函数调用

c++ - 在不同的类上调用不同的成员函数

C++ 在抽象类中重载虚函数,抽象类引用参数不起作用

java - 有没有办法在函数式接口(interface)中重载抽象方法?

c++ - 使用 std::enable_if 作为函数参数与模板参数有什么区别?

c++ - 是否允许递增结束迭代器?

c++ - 3D 数组到 3D std::vector

c# - 在这种情况下,为什么在 lambda 中调用方法时将方法组传递给重载方法会导致歧义?

c++ xerces reference没有定义但已定义