这是隐式调用复制构造函数吗?

Joh*_*n H 2 c++ reference copy-constructor

我有以下课程:

class Player
{
public:
    Inventory& GetInventory()
    {
        return inventory;
    }
private:
    Inventory inventory;
};

class Inventory
{
    // Methods removed for brevity
private:
    std::vector<std::string> items;
};
Run Code Online (Sandbox Code Playgroud)

我想要做的是允许代码的用户修改内容Player::inventory而不能将其重新分配给不同的对象.简短的例子:

Player player;

// OK: I want to able to add items.
player.GetInventory().AddItem("Item 1");

// Not OK: I don't want to be able to assign
// Player::inventory to a different Inventory.
Inventory badInventory;
player.GetInventory() = badInventory;
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过修改GetInventory()返回来实现这一目标Inventory* const,但是这种情况让我怀疑我认为引用的真实性.我相信他们:

  1. 不是对象本身,所以没有地址.
  2. 在他们的一生中不能被重新分配.
  3. 声明时必须初始化.

这对我说,badInventory必须以某种方式被隐含地复制.所以我定义了一个复制构造函数,希望能够记录调用,如下所示:

Inventory(const Inventory& rhs)
{
    std::cout << "Copy ctor." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但这永远不会激发.所以我的问题归结为:这条线上发生了什么?

player.GetInventory() = badInventory;
Run Code Online (Sandbox Code Playgroud)

我在这里遗漏了一些东西,但我不知道它是什么.

小智 6

该行实际上是调用复制赋值运算符,而不是复制构造函数.这是声明为的函数

Inventory& operator=(const Inventory&);
Run Code Online (Sandbox Code Playgroud)

请注意,这player.GetInventory()是一个已经存在的对象,因此它无法调用复制构造函数,因为您没有构造任何东西.

如果要禁止复制库存,请删除以下功能:

Inventory(const Inventory&) = delete;
Inventory& operator=(const Inventory&) = delete;
Run Code Online (Sandbox Code Playgroud)

或者,如果您的编译器缺少C++ 11支持,请将它们声明为private并且不提供定义.

private:
    Inventory(const Inventory&);
    Inventory& operator=(const Inventory&);
Run Code Online (Sandbox Code Playgroud)