Читать «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» онлайн - страница 9
Скотт Мейерс
Говоря о operator()
. Другими словами, это объект, действующий, как функция. Иногда я использую термин в несколько более общем смысле для обозначения чего угодно, что может быть вызвано с использованием синтаксиса вызова функции, не являющейся членом (т.е. functionName(arguments)
). Это более широкое определение охватывает не только объекты, поддерживающие operator(), но и функции и указатели на функции в стиле С. (Более узкое определение происходит из С++98, более широкое — из C++11.) Дальнейшее обобщение путем добавления указателей на функции-члены дает то, что известно как
Функциональные объекты, создаваемые с помощью лямбда-выражений, известны как
Многие сущности в С++ могут быть как объявлены, так и определены.
extern int x; // Объявление объекта
class Widget; // Объявление класса
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.) Официальное определение термина “сигнатура” несколько отличается от моего, но в данной книге мое определение оказывается более полезным. (Официальное определение иногда опускает возвращаемый тип.)