C 11中成员函数的值类别属性是什么?

What are the Value Category Properties of Member Functions in C++11?

本文关键字:属性 是什么 成员 函数      更新时间:2023-10-16

在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的存在,这并不是一个糟糕的,罕见的,也不是前所未有的。