代码之家  ›  专栏  ›  技术社区  ›  nick2225

隐式调用复制构造函数?

  •  2
  • nick2225  · 技术社区  · 4 年前

    我有一个定义了普通构造函数和复制构造函数的类。

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

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

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

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

    1 回复  |  直到 4 年前
        1
  •  3
  •   songyuanyao    4 年前

    在C++17之前,复制操作可能是 elided 但是复制构造函数仍然需要存在并可访问。

    这是一种优化:即使它发生并复制 /move (since C++11) 构造函数没有被调用,它仍然必须存在并且可以访问(就好像根本没有进行优化一样),否则程序的格式就不正确:

    自C++17以来,由于强制删除副本,因此没有此类问题。

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