在C++标准中,定义了C++语言中所有的entity
- values
- objects
- reference
- structured bindings (since C++17)
- functions(不包括lambda)。
- enumerators
- types
- class members
- templates
- template specializations
- namespaces
- parameter packs
特别指出,预处理宏(macro)并不是C++的entity。
以下为个人观点,并非C++标准定义
尽管lambda被认为是匿名函数,但在C++中,lambda表达式计算的结果实则为函数对象(function object);即严格的来说,lambda是实体,但是不是函数实体,而是(函数)对象实体。
auto l = [](){}; // define a lambda
// print: 1
std::cout << std::is_object_v<decltype(l)> << std::endl;
// print: 0
std::cout << std::is_function_v<decltype(l)> << std::endl;
个人观点结束
实体是通过声明
来引入的,同时赋予实体名字
以及相关的属性
。如果一条实体声明语句定义了使用该实体所需的所有属性,这种声明语句被称为定义
。一个实体(内联函数与变量除外)只能由一条定义语句来定义,在C++中被称为单定义规则(one defintion rule)
;但是在必要的时候,可以由多条声明语句来声明。注:如果一个实体有多个定义,即同名实体存在多处定义,在链接时,链接器无法确定程序要引用的是哪个定义。