6

我认为这是不可能的,但我不妨问问。我可以声明一个私有 Copy-Constructor 并仍然使用默认实现吗?

背景:我有一个向量非常大的类,我不想调用复制构造函数,除了一个成员函数。使用标准的公共 copy-ctor 可能很容易导致错误,例如忘记迭代中的引用 ( foreach(Type el,vectOfBigObjects) 而不是foreach(Type const& el,vectOfBigObjects))。因此,我想保留标准副本构造器,但只是将其设为私有。

在不重写 copy-ctors 定义的情况下这可能吗?

4

1 回答 1

12

在不重写 copy-ctors 定义的情况下这可能吗?

在 C++11 中,是的。您只需声明构造函数并将其标记为默认值

struct X
{
    // ...
private:
    X(X const&) = default;
};

这将定义一个复制构造函数,该构造函数与隐式生成的定义相同,但将是private. 例如:

struct X
{
    X() { } // Required because a user-declared constructor in
            // the definition of X inhibits the implicit generation
            // of a default constructor (even if the definition is
            // defaulted!)

    void foo()
    {
        // ...
        X tmp = *this; // OK!
        // ...
    }

private:

    X(X const&) = default; // Default definition, accessible to
                           // member functions of X only!
};

int main()
{
     X x;
     // X x2 = x; // ERROR if uncommented!
}

这是一个活生生的例子

请注意,类定义中用户声明的构造函数(包括复制构造函数)会禁止默认构造函数的隐式生成,即使它的定义是默认的。这就是为什么,例如,我必须X在上面的示例中显式声明 的默认构造函数。

于 2013-04-07T14:57:21.840 回答