不使用C++11移动向量

不使用C++11移动向量,c++,C++,假设我有这样的东西: struct Foo { void Bar (std::vector <int> &vec) ; std::vector <int> m_vec ; }; void Foo::Bar (std::vector <int> &vec) { // Do stuff... m_vec = std::move (vec) ; } 是否有任何方法,可能通过指针欺骗或std::swap,我能够模拟

假设我有这样的东西:

struct Foo
{
    void Bar (std::vector <int> &vec) ;
    std::vector <int> m_vec ;
};

void Foo::Bar (std::vector <int> &vec)
{
    // Do stuff...

    m_vec = std::move (vec) ;
}
是否有任何方法,可能通过指针欺骗或std::swap,我能够模拟m_vec=std::move vec;线假设传入的vec是在堆栈上分配的。

可能是这样的:

void Bar(std::vector<int> & vec)
{
    m_vec.swap(vec);
    std::vector<int>().swap(vec);  // clear "vec"
}
也许是这样:

void Bar(std::vector<int> & vec)
{
    m_vec.swap(vec);
    std::vector<int>().swap(vec);  // clear "vec"
}

第一次交换完成所需的操作。但是为什么要使用第二次交换而不是vec?明白吗?第二次交换是多余的。在构造函数中,m_vec已经是有效的空向量。@重复数据消除程序如果多次调用此函数,则m_vec不再为空。确定,但在这种情况下,行的顺序错误。还是不想免费使用异常安全?@Deduplicator:Bar不是构造函数。由于vector::swap无法抛出,因此使此函数提供强异常保证的方法是将第二行拆分。在第一次交换之前创建新的空向量,然后再与vec交换。在实践中,您可能会发现在您的实现中创建一个空向量并不重要,因此顺序是不相关的,因为没有任何东西会失败,但我认为这不是保证的。第一次交换完成了所需的工作。但是为什么要使用第二次交换而不是vec?明白吗?第二次交换是多余的。在构造函数中,m_vec已经是有效的空向量。@重复数据消除程序如果多次调用此函数,则m_vec不再为空。确定,但在这种情况下,行的顺序错误。还是不想免费使用异常安全?@Deduplicator:Bar不是构造函数。由于vector::swap无法抛出,因此使此函数提供强异常保证的方法是将第二行拆分。在第一次交换之前创建新的空向量,然后再与vec交换。在实践中,您可能会发现在您的实现中创建一个空向量并不重要,因此顺序是不相关的,因为没有任何东西会失败,但我认为这不能保证。