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);