На самом деле оба - «Указатели являются FCO» и «Указатели не являются FCO» - верныНам нужно принять заявления в соответствующем контексте.(FCO - Объект первого класса)
Когда мы говорим о «указателе» в C ++, мы говорим о типе данных, который хранит адрес некоторых других данных.Теперь, будет ли это FCO или нет, действительно зависит от того, как мы планируем его использовать.К сожалению, эта семантика использования не является встроенной для указателей в C ++.
Если мы используем указатели просто для «указания» на данные, это будет отвечать требованиям FCO.Однако, если мы используем указатель для «хранения» данных, он больше не может рассматриваться как FCO, так как его семантика копирования и назначения не работает.Такие указатели «обработки ресурсов» (или более прямо называемые «сырые указатели») представляют наш интерес в контексте исследования Smart Pointer.Это не FCO, а соответствующие умные указатели.Напротив, простые указатели отслеживания продолжали бы соответствовать требованиям для FCO.
Следующий абзац из книги «Современный дизайн C ++» прекрасно разъясняет суть.
Я цитирую из главы об умных указателях:
Объект с семантикой значенияэто объект, который вы можете скопировать и назначить.Тип int является идеальным примером первоклассного объекта.Вы можете свободно создавать, копировать и изменять целочисленные значения.Указатель, который вы используете для итерации в буфере, также имеет семантику значений - вы инициализируете его так, чтобы он указывал на начало буфера, и увеличиваете его, пока не достигнете конца.Попутно вы можете скопировать его значение в другие переменные для хранения временных результатов.
С указателями, которые содержат значения, выделенные с помощью new, история, однако, сильно отличается.Как только вы написали
Widget * p = новый виджет;переменная p не только указывает, но и владеет памятью, выделенной для объекта Widget.Это потому, что позже вы должны выполнить delete p, чтобы убедиться, что объект Widget уничтожен и его память освобождена.Если в строке после только что показанной строки вы пишете
p = 0;// присваивая что-то еще p, вы теряете право собственности на объект, на который ранее указывал p, и у вас совсем нет шансов снова его захватить.У вас есть утечка ресурсов, и утечки ресурсов никогда не помогают.
Надеюсь, это прояснится.