首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::swap()用于对象安全吗?

std::swap()用于对象安全吗?
EN

Stack Overflow用户
提问于 2015-04-15 10:16:17
回答 2查看 2.8K关注 0票数 3

在这个关于复制和交换的question中,在可接受的答案中有一个swap()函数。

代码语言:javascript
复制
friend void swap(dumb_array& first, dumb_array& second) // nothrow
 {
    // enable ADL (not necessary in our case, but good practice)
    using std::swap; 

    // by swapping the members of two classes,
    // the two classes are effectively swapped
    swap(first.mSize, second.mSize); 
    swap(first.mArray, second.mArray);
}

为什么不只是std::swap(first, second)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-15 10:22:39

std::swap依赖于赋值运算符。因此,如果赋值操作符要调用std::swap,这将导致赋值运算符和std::swap之间的无限的调用链。

关于你标题中的问题。是的,对于具有值语义的行为良好的类,对该类的对象调用std::swap是安全的。出于上述原因,只有类的实现者不能将其用于复制和交换成语。

票数 8
EN

Stack Overflow用户

发布于 2015-04-15 10:45:06

代码片段建议用于C++98,在相同的答案中还有另一个关于C++11 (移动语义)的建议。

swap()函数用于C++98解决方案的原因在Scott的“有效C++”一书中得到了很好的解释。

简略;

代码语言:javascript
复制
  template<typename T>          // typical implementation of std::swap;
  void swap(T& a, T& b)         // swaps a's and b's values
  {
    T temp(a);
    a = b;
    b = temp;
  }

只要您的类型支持复制(通过复制构造函数和复制赋值操作符),默认的交换实现将允许交换类型的对象,而不必做任何特殊的工作来支持它。 但是,默认的交换实现可能不会让您感到兴奋。它涉及到复制三个对象:a到temp,b到a,temp到b。对于某些类型,这些副本都不是真正必要的。对于此类类型,默认交换将使您进入到慢车道的快车道。 这些类型中最重要的是那些主要由指向包含实际数据的另一类型的指针组成的类型。这种设计方法的一个常见表现是"pimpl成语“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29647592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档