C++ string::swap是否因为std::swap(s1,s2)足够而可忽略?

C++ string::swap是否因为std::swap(s1,s2)足够而可忽略?,c++,c++11,swap,move-semantics,rvalue-reference,C++,C++11,Swap,Move Semantics,Rvalue Reference,std::string有一个成员函数swap,这是交换两个大字符串的有效方法 既然我们有了移动语义,那么,给定两个大字符串s1和s2,下面的代码 s1.交换(s2) 在效率方面应与以下规范相同: std::swap(s1,s2) string::swap是否可忽略?拒绝任何东西或多或少是一个失败的原因。对于向后兼容性,编译器供应商不能真正摆脱任何东西——或者一个有价值的客户肯定会抱怨 string::swap是否可忽略 如果您愿意,您可以选择忽略它,并始终调用非会员交换;其效果与调用string

std::string
有一个成员函数
swap
,这是交换两个大字符串的有效方法

既然我们有了移动语义,那么,给定两个大字符串
s1
s2
,下面的代码

s1.交换(s2)

在效率方面应与以下规范相同:

std::swap(s1,s2)

string::swap
是否可忽略?

拒绝任何东西或多或少是一个失败的原因。对于向后兼容性,编译器供应商不能真正摆脱任何东西——或者一个有价值的客户肯定会抱怨

string::swap
是否可忽略

如果您愿意,您可以选择忽略它,并始终调用非会员
交换
;其效果与调用
string::swap
相同,因为
basic_string
swap
专门化是根据成员函数描述的

§21.4.8.8[特殊字符串]

模板无效
交换(基本字符串和lhs,
基本字符串和rhs);
1效果:相当于
lhs.swap(rhs)


我个人的意见是,根据具体情况评估选项,并使用似乎更适合特定场合的选项。

“弃用”是一个沉重的词。
std::swap
已经为
std::string
重载(或专门化或其他),因此它可能会调用
std::string::swap
True,但是
std::string::swap
是否可忽略并不取决于移动语义。这总是同样不必要的。这个问题可以问得更广泛一些-当我们有
std::swap
@xmlmx时,
std::string::swap
的意义是什么?您仍然必须为从对象移动的对象创建空字符串<代码>字符串::swap
不会这样做。(当然,它很可能会被优化掉。)@xmllmx这个专门的版本避免了不必要的构造和临时字符串的破坏。看起来弃用的话题已经从question.OP deprivated deprivation;)中删除了
  template<class charT, class traits, class Allocator> void
  swap(basic_string<charT,traits,Allocator>& lhs,
       basic_string<charT,traits,Allocator>& rhs);