【问题标题】:vector<T>::swap and temporary objectvector<T>::swap 和临时对象
【发布时间】:2012-01-15 03:18:59
【问题描述】:

代码如下:

#include <vector>

int main()
{
    vector<int> v1(5,1);
    v1.swap(vector<int> ());  //try to swap v1 with a temporary vector object
}

以上代码无法编译,报错:

error: no matching function for call to ‘std::vector<int, std::allocator<int> >::swap(std::vector<int, std::allocator<int> >)’

但是,如果我把代码改成这样,它可以编译:

int main()
{
    vector<int> v1(5,1);
    vector<int> ().swap(v1);
}

为什么?

【问题讨论】:

    标签: c++ vector swap temporary-objects


    【解决方案1】:

    因为vector&lt;int&gt;()rvalue(粗略地说是临时的),并且您不能将非const 引用绑定到右值。因此,在这种情况下,您不能将其传递给采用非const 引用的函数。

    但是,在临时对象上调用成员函数非常好,这就是您的第二个示例编译的原因。

    【讨论】:

    【解决方案2】:

    调用v1.swap(std::vector&lt;int&gt;()) 尝试将临时(即std::vector&lt;int&gt;())绑定到非常量引用。这是非法的并且失败了。另一方面,使用 std::vector&lt;int&gt;().swap(v1) 在 [non-const] 临时函数上调用一个非常量函数,这是允许的。

    在 C++2011 中,我原以为声明将更改为 std::vector&lt;T&gt;::swap(T&amp;&amp;),因此可以将 swap() 与临时对象一起使用(但显然,仍然不能与 const 对象一起使用)。正如 GMan 指出的那样,情况并非如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-18
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多