繁体   English   中英

隐式调用复制构造函数?

[英]Copy constructor implicitly called?

我有以下 class,其中定义了普通构造函数和复制构造函数。

#include <iostream>

class Bla
{
public:
    Bla()
    {
        std::cout << "Normal Constructor Called\n";
    }

    Bla(const Bla& other)
    {
        std::cout << "Copy Constructor Called\n";
    }

};

int main() 
{
    Bla a = Bla(); // prints Normal Constructor
}

在主要的 function 中,它按我的预期打印普通构造函数,并且只打印普通构造函数。 但是,如果我将复制构造函数设为 class 的私有成员,编译器会给出错误

error: ‘Bla::Bla(const Bla&)’ is private within this context

从它的外观来看,它看起来像是调用了复制构造函数,但我没有看到从中打印出任何内容。 复制构造函数是否被隐式调用? 这里发生了什么?

在 C++17 之前,复制操作可能会被省略,但复制构造函数仍然需要存在和访问。

这是一个优化:即使它发生并且复制/move (since C++11)构造函数没有被调用,它仍然必须存在并且可以访问(就好像根本没有优化发生一样),否则程序是错误的-形成:

自 C++17 以来,由于强制复制省略,因此不存在此类问题。

在以下情况下,编译器需要省略 class 对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。 对象被直接构建到存储中,否则它们将被复制/移动到那里。 复制/移动构造函数不需要存在或可访问:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM