C 11中成员函数的值类别属性是什么?
What are the Value Category Properties of Member Functions in C++11?
在cppreference上读取有关C 11中的价值类别,我发现很难理解具有成员函数的动机。
a.m
,对象表达式的成员,其中m
是...非静态成员函数
除外,它们并不是真正的值
表达式
a.mf
... [和friends] ...被归类为prvalue表达式,但不能用于任何目的,除非是函数呼叫call操作员的左手参数
此外,C 17临时物质如何与成员函数的值类别相互作用?从cppreference,
临时物质化发生...执行会员访问在类prvalue上
通常,对我来说,函数是不可修道的lvalues。也就是说,他们有一个定义的位置。我知道,在虚拟成员函数的情况下,没有编译时间位置,所以我明白了为什么这种情况不会是lvalue。我还看到,临时物质化的类的成员函数也可能没有编译时间位置,并且可能不是LVALUE,尽管该成员函数仍在某个地方编译并具有一个位置(C 可能简单地使得不可能在上引用该位置语言级别)。
对我来说最令人困惑的是,编译器最终不会与其他任何功能不同。唯一的区别是名称杂交。那么,为什么在世界上它们属于不同的价值类别?
必须有一些令人信服的原因,即成员函数在定义良好的位置时不是LVALUE。这是一些真正的泥泞水。有人可以提供动力和澄清吗?
非静态成员函数没有"定义良好的位置"。虚拟成员函数的"位置"在编译时未知(通常)。甚至忽略了这一点,成员功能的"位置"从未真正在C 中处理。
是的,有"成员函数的指针",但请注意,这些类型不是可转换到其他事物的指针。该标准甚至不允许实现允许通过reinterpret_cast
转换为整数,并返回正常指针的方式。在内存地址的意义上,它们不是"指针"。
成员函数的位置与其他C 事物的相同意义。因此,将它们归类为Prvalues是有意义的。
此外,C 17临时物质如何与成员函数的值类别相互作用?
临时物质化适用于对象;成员函数不是对象。请注意您引用的内容:"在类prvalue 上执行成员访问时"。成员功能不是类,因此不适用。
对我来说最令人困惑的是,编译器最终不会与任何其他功能不同。
。
编译器如何实现标准是无关紧要的。该标准宣布它们为Prvalues,所以这就是它们。
经过一点思考,很明显,为什么成员作为lvalues会变得荒谬。任何成员函数都有一个隐式参数参数this
,该参数从C 语言级别上抽象。结果,成员函数的lvalue对this
没有上下文,这将是没有用的,因为无法调用它。
此外,虚拟类还具有附加的隐藏虚拟指针成员。虚拟成员函数已经无法成为lvalues,因为它们在编译时不受抵抗,但是虚拟指针成员也会丢失,因为它是从this
中检索的,因此这是虚拟成员函数不能成为lvalue的第二个原因。
我认为这是C 设计的错误,并且成员的配音是" PRVALUES"的掩盖。如果没有隐藏的参数,则成员函数将是LVALUE(通过对对象的引用来调用)。此外,如果没有隐藏的类成员,并且如果没有隐藏虚拟表,则可以查询虚拟表以在运行时检索lvalues到虚拟函数(目前在C 中完全不可能)。当然,将指定虚拟函数的实现,但考虑到RVO和复制Elision的存在,这并不是一个糟糕的,罕见的,也不是前所未有的。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- 'vertexPosition_modelspace'属性到底是什么
- 指示 Qi 变换属性失败的适当方法是什么?
- 将提升属性树 (ptree) 序列化为向量的最快方法是什么
- C 11中成员函数的值类别属性是什么?
- 使用 CDT 从头文件中获取属性定义的节点元素是什么
- PE 中的"Isolated Image"属性是什么?
- 在C++中,继承超类的正确方法是什么,以便它们的子类在超级类和子类中没有重复的属性?
- 保存邮件正文的 MAPI 属性是什么
- BOOST中的属性映射是什么
- pthreads 之间共享和不共享的属性是什么
- 唯一关联哈希映射容器与关联哈希映射集装箱的属性是什么
- 实现具有自动增量实例属性的类的最python的方式是什么?
- 在libXML sax解析器(c++)中获取属性值的正确方法是什么?
- 用不同的符号表重新计算Boost Spirit解析属性的最有效方法是什么?
- gcc 使用的属性的用例是什么?
- java注释与c#属性是一样的吗?在c++中等效的是什么?
- 函数的属性是什么意思
- [[carries_dependency]]属性是什么意思