使用宏来覆盖移动函数的接口的缺点



使用宏作为所有移动语义的接口的缺点是什么?

我最近在类(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 共享一些代码,但通常您不希望它们。

为一些简单的资源管理类型做这种宏观黑客是一个坏主意。在整个地方拥有复杂的资源管理类型是一个坏主意。这个宏观黑客的行动并不是从根本上讲的操作。通常,只有在宏的昂贵时才能使用宏。

您的宏没有增加实用程序。它所做的看起来容易出现虫子和危险。如果您必须调试它,您将获得不可算的代码。

因此,有很多理由不使用该宏,很少有使用它。

构造,分配和破坏都被捆绑在一起。分配可以被视为破坏 构造天真的构造,但这通常不受影响。而且您甚至没有破坏!

最新更新