【发布时间】:2012-10-31 17:50:33
【问题描述】:
我的理解是 C++ 隐式生成赋值运算符会执行成员方式复制(这似乎也得到了this answer 的证实)。但是,如果在成员复制期间抛出异常(例如,因为无法分配该成员的资源),被复制的对象是否会卡在无效状态?
也就是说,隐式生成的赋值运算符是否只实现了基本保证,而没有实现强保证?
如果我们想为我们的类副本提供 strong 保证,我们是否必须使用 copy-and-swap 习惯用法手动 实现赋值运算符?
【问题讨论】:
-
“无法分配资源”,如果您的意思是为其分配内存的指针数据成员,那么赋值运算符已经无法满足它。默认的成员明智副本只会将相同的地址复制到新指针中。这就是我们编写复制构造函数的经典原因
-
@Mr.C64 根据 C++ 11 标准赋值运算符不是隐式生成的,但复制赋值运算符会。
-
@fayyazkl:不,我不是指原始指针数据成员。我正在考虑一个 C++ RAII 类,它的数据成员是 RAII 资源管理器(不是原始指针)。
-
@spin_eight:隐式生成的赋值运算符是一个复制赋值运算符。我不认为这里有任何歧义(除了 C++11 引入了移动分配,但这不是 Mr.C64 所要求的,因为它不执行成员明智的复制) .
标签: c++ exception assignment-operator exception-safety