【发布时间】:2021-03-19 08:45:52
【问题描述】:
prefix++ 的操作数类型定义如下:
操作数的类型应为除 cv bool 以外的算术类型,或指向完全定义的对象类型的指针。
措辞object type的正式定义定义为:
basic.types#general-8
对象类型是(可能是 cv 限定的)类型,它不是函数类型,不是引用类型,并且不是 cv void强>。
但是,请考虑以下代码:
#include <iostream>
struct Test{
int a;
};
int main(){
int Test::* member_ptr = &Test::a;
++member_ptr; // Permite this operation?
}
根据object type的定义,member type不被它排除。这是否意味着我们可以将member type 视为object type?你会说members不是对象,所以pointer to member不能作为prefix++的操作数。但是,我会在这里争论,函数是对象吗?这绝对不是,为什么function type 被object type 和reference type 的定义排除在外。那么,没有将member type放到专属集合中是不是缺陷呢?
更新
MM 的回答引用了这个规则:
除了指向静态成员的指针外,引用“指针”的文本不适用于指向成员的指针。
我知道这条规则。但是,我认为pointers 只是指文字pointers。毕竟pointers这个文字已经出现在标准中了。如:expr.eq#2比较指针定义如下。 (这里绝对可以应用该规则,即不适用于指向成员的指针)。但是,我不认为文本 pointers 也表示 pointer to X 形式(其中 X 不是 member,例如 object、function)。有必要澄清这个规则吗?
除了描述任何地方,
pointer to X(其中 X 可能是对象、函数或类型)或pointers不适用于pointer to member。
【问题讨论】:
-
请解释一下
member type是什么意思 -
除非明确提及,“指针”不包括成员指针。
-
@M.M 那可能是
class nested-name-specifier of type T。 (但是,不允许将此类内容用作类型说明符)。 -
@PasserBy 是的,我知道that。但是,这里指的是
pointer to object type。
标签: c++ language-lawyer