C++ C++;11标准库中的值和对象示例?

C++ C++;11标准库中的值和对象示例?,c++,object,c++11,language-lawyer,C++,Object,C++11,Language Lawyer,在C++11 3p3中,它表示: 实体是一个值、对象、引用、函数、枚举器、类型、类成员、模板、模板专用化、命名空间、参数包或此 17.6.1.1p1中规定: C++标准库为以下类型的实体提供定义:宏、值< /强>、类型、模板、类、函数、对象< /强> ./p> 什么是C++标准库提供的定义的一个例子,那不是一个对象,相反地,什么是C++标准库提供的一个对象的例子,那不是一个值?< /p> < p>一个对象是存储在内存中的东西(参见1.8:“对象是一个存储区域”)。每个对象都有一个值(即对象本身

在C++11 3p3中,它表示:

实体是一个对象、引用、函数、枚举器、类型、类成员、模板、模板专用化、命名空间、参数包或此

17.6.1.1p1中规定:

C++标准库为以下类型的实体提供定义:宏、<强>值< /强>、类型、模板、类、函数、<强>对象< /强> ./p>


<>什么是C++标准库提供的定义的一个例子,那不是一个对象,相反地,什么是C++标准库提供的一个对象的例子,那不是一个值?< /p> < p>一个对象是存储在内存中的东西(参见1.8:“对象是一个存储区域”)。每个对象都有一个值(即对象本身),但值更一般,因为每个表达式的求值都会给出一个值。例如,prvalue,例如声明函数
tf()的
f()
,可能有存储空间,也可能没有存储空间–您无法获取其地址,并且其存在可能不需要以存储空间的形式显示。(但是,一旦将值绑定到引用变量或形式参数,现在就可以按名称引用对象了。)


不过,区别主要在于语言语义,通常不具有实际意义。(例如,人们经常提到“临时对象”,尽管“临时值”更准确。)值和对象都有类型(始终是对象类型),可以对对象求值以生成值,并且可以将值视为对象。在谈论代码设计、分配和存储时,我会使用“object”,在谈论语言的语法规则时,我会使用“value”。在27.4.1[iostreams.objects.overview]中定义的标准iostream对象,如
cin
cout
cerr
clog
(及其广泛的字符表亲)将是标准库定义的对象的示例


类似的,<>代码:ST::iOSKAS::FMTFLASG/<代码>类型定义在<强> 27.5.3[iOS.Base] /Sturn>中定义了几个<代码> CONTXPRP</代码>值(例如,代码> BooAlgult)。C++标准不提供“值”的定义,依赖于它的普通英语意义。 <> C++标准库提供了许多不是对象的值。一个简单的例子是NULL。其他包括sisixMax、ExtIIn成功和FEYOFFULL。

C++标准库提供了对对象的一些定义,在“存储区域”的名称上,我知道的(只有一个评论员的)是“标准的IoSoW对象”,例如CIN和CUT.< /P> 因为它包含了C标准库,另一个明显的错误是errno,尽管这其中也包含了“errno可能不是一个对象的标识符”这一说法

标准库确实提供了大量函数,这些函数在执行时返回指向对象的指针,new和malloc()就是明显的例子。因此,如果您愿意,它定义了许多动态对象


[编辑以包含iostream对象,新增]

这并不能直接回答问题,但cppreference非常擅长对这些内容进行分类:和@remyabel:谢谢,但值类别不是值。值类别是表达式的属性。同样,表达式也有值。不清楚的是“标准库为其提供定义的值"对象和值是核心语言的一部分,所以我不认为标准库会有很大帮助。值是对象可以保存的东西,一次一个。@ KerrekSB对我来说很好。我无意把C带到这一点,但是我确实有时会把C和C++规则混淆起来。总之,C++ 11有一个精确但令人吃惊的防御。“value”的定义。参见[basic.types]p4,这里的注释太长。“value”只适用于可复制的类型,对于这些类型,“value”是“object”中的位所代表的。令人惊讶的是,其他类型根本没有值。它们有左值、xvalue和prvalue,但只有“value”甚至不存在。@hvd:不,这是值表示法……所有对象都有值,但对于可复制的对象,值表示法决定值。(即,复制值表示法等于复制值。)@KerrekSB值在同一段中定义,该句紧跟在定义值表示的语句之后。值用斜体表示,这意味着它是该术语的定义。”(例如,人们经常提到“临时对象”,尽管“临时值”更准确。)。”术语“临时值”对我来说,这听起来像是一个荒谬的事情。C++中的“临时”属性限制了生命周期。但是一个值没有生命周期。它是一组比特的意义,它是“非物质的”。,有点。事实上,临时的是保存值的对象。
NULL
宏将什么解析为值?还有
io_errc::stream
,它被定义为枚举器。@dyp[diff.library]/3将
NULL
定义为宏(即由预处理器扩展)和[diff.library]/4将
CHAR\u-BIT及其近亲定义为值。@TemplateRex我认为CHAR\u-BIT及其近亲被定义为纯粹继承C的值。但从词汇上讲,它们命名为文字,文字表示值,但它们本身不是值,因为值与“物理表示”的“逻辑意义”更相关对于文字,或者更好地说,文字以某种方式“映射”到的物理表示