C++ 11/14 Уникальный указатель не так уникален?

Я только что зафиксировал ситуацию, когда в качестве аргумента функции была передана ссылка unique_pointer. Поэтому я взглянул на это и обнаружил, что код на самом деле компилируется и выполняется.

Почему это возможно? Как указатель уникален, когда вы можете иметь ссылку на этот указатель?

Вот мой пример:

class Foo{
    public:
    int bar{23};
};

void Bar(std::unique_ptr<Foo>& a_foo){
    a_foo->bar = 42;
}

int main(int argc, char *argv[]){

    auto foo{ std::make_unique<Foo>() };
    Bar(foo);
    std::cout << foo->bar << std::endl; //outputs 42

    return 0;
}

2 ответа

Решение

Как указатель уникален, когда вы можете иметь ссылку на этот указатель?

Вы можете иметь столько ссылок на этот указатель, сколько захотите, но на самом деле есть только одна из них.

Удалить & так что вы пытаетесь скопировать unique_ptr, и ваша программа не будет строить. Вам не разрешено клонировать / копировать указатель, чтобы было несколько указателей на одну и ту же вещь. Вот что значит "уникальный".

Ссылка не создает новый экземпляр указателя. То, что вы можете ссылаться на указатель, не означает, что он не уникален. Я могу ссылаться на вас по имени, это не значит, что я клонировал вас каждый раз, когда я использую ваше имя:) Ссылка в C++ в этом отношении похожа на имя человека.

Другие вопросы по тегам