Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 | страница 11
>bool func(const Widget& w); // Объявление функции
>enum class Color; // Объявление перечисления
> // с областью видимости
> // (см. раздел 3.4)
Определение предоставляет информацию о расположении в памяти и деталях реализации:
>int x; // Определение объекта
>class Widget { // Определение класса
>};
>bool func(const Widget& w)
> { return w.size() < 10; } // Определение функции
>enum class Color
> { Yellow, Red, Blue }; // Определение перечисления
Определение можно квалифицировать и как объявление, так что, если только то, что нечто представляет собой определение, не является действительно важным, я предпочитаю использовать термин “объявление”.
Сигнатуру функции я определяю как часть ее объявления, определяющую типы параметров и возвращаемый тип. Имена функции и параметров значения не имеют. В приведенном выше примере сигнатура функции >func
представляет собой >bool(const Widget&)
. Исключаются элементы объявления функции, отличные от типов ее параметров и возвращаемого типа (например, >noexcept
или >constexpr
, если таковые имеются). (Модификаторы >noexcept
и >constexpr
описаны в разделах 3.8 и 3.9.) Официальное определение термина “сигнатура” несколько отличается от моего, но в данной книге мое определение оказывается более полезным. (Официальное определение иногда опускает возвращаемый тип.)
Новый стандарт С++ в общем случае сохраняет корректность кода, написанного для более старого стандарта, но иногда Комитет по стандартизации не рекомендует применять те или иные возможности. Такие возможности находятся в “камере смертников” стандартизации и могут быть убраны из новых версий стандарта. Компиляторы могут предупреждать об использовании программистом таких устаревших возможностей (но могут и не делать этого), но в любом случае их следует избегать. Они могут не только привести в будущем к головной боли при переносе, но и в общем случае они ниже по качеству, чем возможности, заменившие их. Например, >std::auto_ptr
не рекомендуется к применению в C++11, поскольку >std::unique_ptr
выполняет ту же работу, но лучше.
Иногда стандарт гласит, что результатом операции является неопределенное поведение (undefined behavior). Это означает, что поведение времени выполнения непредсказуемо, и от такой непредсказуемости, само собой разумеется, следует держаться подальше. Примеры действий с неопределенным поведением включают использование квадратных скобок (