C++编译器自动生成复制构造函数和复制赋值运算符.为什么不swap呢?
目前,实现复制赋值运算符的首选方法是复制和交换习惯用法:
T& operator=(const T& other)
{
T copy(other);
swap(copy);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
(忽略使用pass-by-value的copy-elision-friendly表单).
这个习惯用法具有在异常情况下处于事务处理的优点(假设swap实现不抛出).相反,默认的编译器生成的复制赋值运算符递归地对所有基类和数据成员进行复制赋值,并且没有相同的异常安全保证.
同时,swap手动实现方法既繁琐又容易出错:
swap不抛出,必须为类和基类中的所有非POD成员,非POD成员等实现它.swap方法.如果不这样做可能会引入微妙的错误.此外,由于swap是一种普通的方法,如果swap实现不完整,编译器(至少我不知道)不会发出警告.如果编译器swap自动生成方法会不会更好?然后隐式复制赋值实现可以利用它.
显而易见的答案可能是:在开发C++时,复制和交换习惯用法不存在,现在这样做可能会破坏现有代码.
尽管如此,也许人们可以选择swap使用C++ 0x用于控制其他隐式函数的相同语法来生成编译器:
void swap() = default;
Run Code Online (Sandbox Code Playgroud)
然后可能有规则:
swap方法,则可以使用copy-and-swap实现隐式复制赋值运算符.swap方法,则将像以前一样实现隐式复制赋值运算符(在所有基类和所有成员上调用copy-assigment).有没有人知道这些(疯狂?)的事情是否已经向C++标准委员会提出过建议,如果有的话,委员会成员有什么意见?