Почему std :: unique_ptr имеет оператор равенства? - PullRequest
5 голосов
/ 03 апреля 2020

Я недавно думал об этом, и единственный аргумент, который я вижу, чтобы иметь оператор равенства для std :: unique_ptr, это для полноты, поэтому он есть у всех умных указателей в стандартной библиотеке шаблонов. Но если вы не сделали что-то не так, я не вижу ни одного примера, где это может вернуть true.

Очевидно, что можно сделать что-то вроде:

int* a = new int(1);
std::unique_ptr<int> u_a1(a);
std::unique_ptr<int> u_a2(a);

if(u_a1 == u_a2)
{
    std::cout << "I'm double deleting soon" << std::endl;
}

Но не ' t включение оператора просто позволяет людям совершать подобные ошибки, а компилятор не выдает ошибку? Не будет ли больше смысла удалить его, или я что-то упустил?

Ответы [ 3 ]

8 голосов
/ 03 апреля 2020

Равенство на самом деле может вернуть истину. Простейший случай - два пустых указателя:

std::unique_ptr u_a1;
std::unique_ptr u_a2;

if (u_a1 == u_a2) // ...

Операторы также позволяют сравнивать unique_ptr<T, D> объекты разных типов, поэтому у вас может быть два разных типа удалителей, которые будут выполнять разные операции с одним и тем же указателем при очистке. Или даже какой-либо другой инструмент, отличный от стандартного, который намеренно может делать одну и ту же вещь более одного раза (счетчик?).

Присутствие операторов может также сделать тип допустимым в некоторых шаблонах, которые могут потребоваться сравнивать объекты его зависимых типов.

2 голосов
/ 03 апреля 2020

Интеллектуальные указатели имеют ту же семантику, что и необработанные указатели, только с добавленной семантикой автоматического владения. Поскольку необработанные указатели можно сравнивать, то же самое можно сказать и об их интеллектуальных указателях. Имеет ли смысл сравнивать 2 unique_ptr s, это отдельный вопрос.

1 голос
/ 03 апреля 2020

Вы можете использовать это, чтобы проверить, является ли unique_ptr нулевым, и вы также можете иметь ссылки на unique_ptr, чтобы вы могли использовать это, чтобы увидеть, ссылаются ли они на тот же unique_ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...