【问题标题】:Macro to make class noncopyable使类不可复制的宏
【发布时间】:2015-02-27 16:52:57
【问题描述】:

以下宏是否有任何问题导致类不可复制?

#define PREVENT_COPY(class_name) \
class_name(const class_name&) = delete;\
class_name& operator=(const class_name&) = delete;

class Foo
{
public:
    PREVENT_COPY(Foo)

    // .......
};

【问题讨论】:

  • 您的宏的第一行似乎缺少连续斜杠。
  • “他们对使类不可复制的以下宏有任何问题吗?” 是的,这会使您的代码对其他人不可读(不太可靠)。
  • @abelenky,移动对象与复制对象不同。 拥有移动构造函数的部分目的是允许移动无法复制的东西(例如std::unique_ptr)。
  • @πάντα ῥεῖ 我不同意,它比您不想复制的每个类的主体中的一堆已删除函数/tors 更具可读性。
  • 我不明白,将复制构造函数和赋值 declarations 放在private 部分(没有任何实现)应该可以防止复制。 = delete 需要什么?

标签: c++ c++11 c-preprocessor noncopyable deleted-functions


【解决方案1】:

通常,宏的构造通常需要在行尾使用分号,就像普通语句一样。

因此,我建议:

#define PREVENT_COPY(class_name) class_name(const class_name&) = delete;\
                                 class_name& operator=(const class_name&) = delete

用法:

class Foo
{
public:
    PREVENT_COPY(Foo); // Semi-colon required.

    // .......
};

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 2016-01-10
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多