Значение интерфейсов f(T*, int) и интерфейсов f(span‹T›) в основных рекомендациях cpp

Раздел P3 из основные принципы cpp предлагают следующий шаблон в разделе принудительного исполнения:

Интерфейсы f(T*, int) и интерфейсы f(span)

Может ли кто-нибудь объяснить, что это значит для сварливого старого программиста на C, который хочет понять современный C++?


person Joe    schedule 03.11.2017    source источник
comment
подробнее о span здесь   -  person Default    schedule 03.11.2017


Ответы (1)


Раздел P3 посвящен «Выражению намерения». Таким образом, идея заключается в том, какой из них более ясно выражает намерение.

Рассмотрим f(T*, int). Мы должны спросить:

  1. Указатель указывает на один объект или на массив?
  2. Представляет ли целое число размер массива или что-то еще?

Информация не очень хорошо выражена в сигнатуре функции. Он должен быть получен другими способами, т.е. документы, соглашения об именах и т. д.

С другой стороны, когда мы видим, что f(span<T>) имеет четкое и неоспоримое намерение: функция принимает массив (на который ссылается объект span<T>). Намерение ясно, потому что это единственная цель span, в отличие от указателя, который является многоцелевым.

Таким образом, f(span<T>) лучше формулирует намерение, если намерение состоит в том, чтобы взять массив.

person Community    schedule 03.11.2017
comment
В дополнение к заданным вами вопросам я бы добавил, может ли указатель быть нулевым? И какова семантика владения? (ответ на последний вопрос должен заключаться в том, что вызывающийвызывающий владеет данными, но существует достаточно устаревших API, поэтому этот вопрос все еще остается вопросом). - person Martin Bonner supports Monica; 03.11.2017