Pre C ++ 11等效于显式删除构造函数(Type(const Type&)= delete;)

时间:2014-02-02 11:29:49

标签: c++ c++11 constructor

有没有办法在不支持C ++ 11的编译器上实现这种行为?

class Meow
{
public:
    Meow(const Meow&) = delete;
};

将构造函数设为私有不是一个解决方案,因为那样你可以做类似的事情:

class Meow
{
private:  
    Meow(const Meow&);

public:
    Meow();

    void doSomething()
    {
        Meow kitty;
        Meow secondKity(kitty); // allowed
    }
};

如果构造函数标记为deleted,则无法进行上述操作。

2 个答案:

答案 0 :(得分:7)

将构造函数设为私有是C ++ 11之前的解决方案。您的第二个代码无效,因为复制构造函数没有定义(假设您没有在其他地方给出定义)。是的,这不是最好的解决方案,但这就是= delete被引入的原因。

您可能希望使用boost::noncopyable更明确地说明它,但它只会做同样的事情。

答案 1 :(得分:0)

您可以使用私有,未定义的复制构造函数轻松模拟它。

,而不是一个好的错误消息,你会得到一个链接器错误,因为没有找到复制构造函数。

另一种选择是boost::noncopyablehttp://www.boost.org/doc/libs/1_55_0/libs/utility/utility.htm#Class_noncopyable),它将这种技术包装在一个漂亮的小助手类中。