class UnusualClass
{
    int a;
    public:
        UnusualClass(int a){std::cout<<"Direct initialization"<<std::endl;}
        UnusualClass(const UnusualClass &n){std::cout<<"Copy initialization"; }
};


int main ()
{
    UnusualClass k1(5);    //Direct initialization
    UnusualClass k2=56;   //Copy initialization
    return 0;
}

为什么编译器两次打印出“直接初始化”?我进行了一些研究,发现可能会导致复制构造函数省略。
在这两种情况下是否有可能获得两种不同的结果?
另外,当我使用UnusualClass(const UnusualClass &n)=delete时,我得到一个错误,说use of deleted function 'UnusualClass::UnusualClass(const UnusualClass&)。如果仍然跳过此构造函数,为什么会出现此错误?

我知道我可以通过使用两个构造函数UnusualClass(int a);UnusualClass(double b);来获得两种不同的结果,但是这种技巧似乎不太正确。

最佳答案

这不是copy initialization:

UnusualClass k2=56;   // NOT Copy initialization
                      // for 56 is not of type UnusualClass

它将调用构造函数:
UnusualClass(int a)

我想你的意思是:
UnusualClass k1(5);    //Direct initialization
UnusualClass k2{k1};   //Copy initialization
UnusualClass k2 = k1;  //Copy initialization

注意copy initialization中所需的类型。
UnusualClass(const UnusualClass &n) // const reference to type UnusualClass

它应该是对象的类型,它是UnusualClass,而不是int
更新


UnusualClass::UnusualClass(const UnusualClass&) = delete;

方法:

cppreference



因此,您将需要定义自己的拷贝构造函数。

更新2

有关copy-initialization的更多信息,请参见@songyuanyao的答案

关于C++-直接和复制构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50434070/

10-11 16:13