我试图了解右值引用构造函数和赋值运算符。我创建了以下源代码,该源代码应调用右值引用构造函数,但是不会发生。我怀疑是复制删除优化的原因。有谁知道那是原因吗?另外,如果复制删除是原因,那么在代码中右值引用的意义是什么?

#include <iostream>
#include <vector>
using namespace std;

class X {
public:
    X() : v{new vector<int>(0)} { }
    X(const X&);
    X(X&&);
    X& operator=(const X& rhs);
    X& operator=(X&& rhs);
private:
   vector<int> *v;
};

X::X(const X& a)
{
    cout << "copy constructor" << endl;
    for (auto p : *(a.v))
        v->push_back(p);
}

X::X(X&& a) : v{a.v}
{
    cout << "rval ref constructor" << endl;
    a.v = nullptr;
}

X& X::operator=(const X& rhs)
{
    cout << "assignment operator" << endl;
    delete v;
    v = new vector<int>();
    for (auto p : *(rhs.v))
        v->push_back(p);
    return *this;
}

X& X::operator=(X&& rhs)
{
    cout << "rval ref assignment op" << endl;
    swap(v, rhs.v);
    return *this;
}

X f0()
{
    return X(); // copy-elision no move called
    // return move(X());
}

int main(int argc, char *argv[])
{
    X x1(f0());

    return 0;
}

最佳答案

将以下内容添加到main()中:

X x2(std::move(x1));

这手动指示对象x1可以从其移动以解决复制删除问题。 copy-elision并不总是被调用,因此在某些情况下可能需要右值引用构造函数和赋值运算符。

关于c++ - C++:右值引用构造函数和复制删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62238613/

10-12 15:35