Нет стандартного способа сравнения умного указателя с регулярным указателем?

Почему в стандарте С++ нет операторов сравнения для сравнения интеллектуальных указателей (unique_ptr, shared_ptr,...) с регулярными указателями (T *)?

Tom

Обновление Я не собираюсь выяснять, как это можно сделать. Вопрос в том, почему он не определен как часть стандарта С++? Для unique_ptr и shared_ptr такие определения были бы тривиальными.

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

Ответ 1

Почему в стандарте С++ нет операторов сравнения для сравнения интеллектуальных указателей (unique_ptr, shared_ptr,...) с регулярными указателями (T *)?

Принцип, лежащий в основе этого решения, обычно указывается как "сделать ваши интерфейсы легкими в использовании правильно, и трудно/невозможно использовать неправильно".

Концептуально, умный указатель и необработанный указатель не совпадают.

Умный указатель налагает ограничения (т.е. "unique_ptr - это указатель, но вы не можете иметь несколько копий" ). Хотя они ведут себя как указатели (до точки - если вы извините каламбур), у них разная семантика.

То есть, если у вас есть:

int *p1 = new int{5};
std::unique_ptr<int> p2{new int{5}};

p1 == p2.get();

Сравнение легко сделать, явным и делает очевидным, что вы сравниваете яблоки и яблоки (легко понять, что происходит - вы сравниваете со значением необработанного указателя).

С помощью пользовательского оператора сравнения, с другой стороны, возникли бы странные вопросы ( "уникальная уникальная уникальность, как вы можете сравнить ее с чем-то другим?", если она уникальна, она всегда должна быть другой ").

Ответ 2

Вы можете просто сделать smart_ptr.get() == raw_ptr, что с этим не так?

Ответ 3

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

Ответ 4

Основная причина, вероятно, связана с тем, что если вы используете стандартных интеллектуальных указателей, не должно быть никаких необработанных указателей на объект. Наличие необработанного указателя на объект почти гарантия, что в какой-то момент во время обслуживания кто-то будет в конечном итоге создавая из него второй умный указатель, с рискованным последствия. (Единственное исключение - это нулевой указатель, а стандарт позволяет сравнивать с константой нулевого указателя.)