隐式调用复制构造函数?

尼克2225

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

#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
}

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

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

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

songyuanyao

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

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

自 C++17 以来,由于强制复制省略而没有这样的问题。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章