使用宏作为所有移动语义的接口的缺点是什么?
我最近在类(http://stackoverflow.com/a/4782927/(中阅读了有关移动相关函数的语法,我认为,它非常乏味和重复: -
C(C&&) = default; // Move constructor
C& operator=(C&&) & = default; // Move assignment operator
,如果我想自定义具有相同实现的移动和构造人,那就更脏了。(与复制构造函数相同的问题,= C 中的运算符过载:一个常见的函数吗?(
因此,我决定创建一个宏观(掉期函数(,以使所有内容都在一个地方简洁。
#define MACRO_MOVE(C)
C& operator=(C&& that) & {
moveHack(this,&that); return *this;
}
C(C&& that){
moveHack(this,&that);
}
static void moveHack(C* dst,C* src)
这是用法: -
class X{
int data=42;
MACRO_MOVE(X){
dst->data=src->data;
src->data=0;
}
};
但是,我以前没看过有人喜欢这样。
我应该关注什么问题吗?
这种方法是否有具体的缺点?
零的规则是,只有管理资源(如内存(的类需要明确的移动/复制分配/施工方法。
您可以将几乎每种类型的存储都纳入自我管理资源中。这些资源类型往往是几种不同的变体之一(价值指针,独特的指针,共享指针等(。
通常,在移动分配时,您还需要清理现有状态。移动构造时,事实并非如此。两个实现 can 共享一些代码,但通常您不希望它们。
为一些简单的资源管理类型做这种宏观黑客是一个坏主意。在整个地方拥有复杂的资源管理类型是一个坏主意。这个宏观黑客的行动并不是从根本上讲的操作。通常,只有在宏的昂贵时才能使用宏。
。您的宏没有增加实用程序。它所做的看起来容易出现虫子和危险。如果您必须调试它,您将获得不可算的代码。
因此,有很多理由不使用该宏,很少有使用它。
构造,分配和破坏都被捆绑在一起。分配可以被视为破坏 构造天真的构造,但这通常不受影响。而且您甚至没有破坏!