std::size_t n = sizeof( long );
На самом деле, вы не спросили, что конкретно является плохой практикой в вышеизложенном. Использование size_t, квалификация с пространством имен std, ...
Как сказано в стандарте C ++ (18.1), size_t - это тип, определенный в стандартном заголовке. Я бы предложил отбросить любые мысли и впечатления о возможном наследовании языка Си. C ++ - это отдельный и другой язык, и его лучше рассматривать как таковой. Он имеет свою собственную стандартную библиотеку, и все элементы стандартной библиотеки C ++ определены в пространстве имен std. Тем не менее, можно использовать элементы стандартной библиотеки C в программе C ++.
Я бы посчитал, что это грязный хак. Стандарт C ++ гласит, что содержимое заголовков такое же или основано на соответствующих заголовках из стандартной библиотеки C, но в ряде случаев были применены изменения. Другими словами, это не прямое копирование и вставка заголовков C в заголовки C ++.
size_t не является встроенным типом в C ++. Это тип, определенный для указания того, какой тип целочисленного типа используется в качестве возвращаемого типа оператора sizeof (), поскольку фактический тип возвращаемого значения sizeof () определяется реализацией, поэтому стандарт C ++ объединяет путем определения size_t.
будет следующая программа (без
включает в себя) ожидать компиляции на
все компиляторы C ++?
size_t foo()
{
return sizeof( long );
}
Стандарт C ++ гласит (1.4):
Имена, определенные в библиотеке, имеют область имен (7.3). Модуль перевода C ++ (2.1) получает доступ к этим именам, включая соответствующий стандартный заголовок библиотеки (16.2).
size_t - это имя, определенное в пространстве имен std, поэтому каждая программа, использующая это имя, должна включать соответствующий заголовок, в этом случае.
Далее в главе 3.7.3 говорится:
Однако ссылки на std, std :: bad_alloc и std :: size_t являются некорректными, если имя не было объявлено путем включения соответствующего заголовка.
Принимая во внимание, что программа, использующая size_t, но не включающая заголовок, некорректна.