相关疑难解决方法(0)

为什么C++ 0x中没有编译器生成的swap()方法?

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手动实现方法既繁琐又容易出错:

  1. 为了确保swap不抛出,必须为类和基类中的所有非POD成员,非POD成员等实现它.
  2. 如果维护者将新数据成员添加到类中,则维护者必须记住修改该类的swap方法.如果不这样做可能会引入微妙的错误.此外,由于swap是一种普通的方法,如果swap实现不完整,编译器(至少我不知道)不会发出警告.

如果编译器swap自动生成方法会不会更好?然后隐式复制赋值实现可以利用它.

显而易见的答案可能是:在开发C++时,复制和交换习惯用法不存在,现在这样做可能会破坏现有代码.

尽管如此,也许人们可以选择swap使用C++ 0x用于控制其他隐式函数的相同语法来生成编译器:

void swap() = default;
Run Code Online (Sandbox Code Playgroud)

然后可能有规则:

  1. 如果存在编译器生成的swap方法,则可以使用copy-and-swap实现隐式复制赋值运算符.
  2. 如果没有编译器生成的swap方法,则将像以前一样实现隐式复制赋值运算符(在所有基类和所有成员上调用copy-assigment).

有没有人知道这些(疯狂?)的事情是否已经向C++标准委员会提出过建议,如果有的话,委员会成员有什么意见?

c++ language-design c++11

45
推荐指数
2
解决办法
3220
查看次数

移动语义==自定义交换功能已过时?

最近,许多 问题 弹出如何提供自己的swap功能.使用C++ 11,std::swap将使用std::move和移动语义以尽可能快地交换给定值.当然,这仅适用于提供移动构造函数和移动赋值运算符(或使用按值传递的运算符)的情况.

现在,有了这个,是否真的有必要swap在C++ 11中编写自己的函数?我只能想到不可移动的类型,但是再一次,自定义swaps通常通过某种"指针交换"(也就是移动)来工作.也许有某些参考变量?嗯...

c++ swap obsolete move-semantics c++11

31
推荐指数
1
解决办法
5452
查看次数

标签 统计

c++ ×2

c++11 ×2

language-design ×1

move-semantics ×1

obsolete ×1

swap ×1