对于什么对象指针值,指向成员的指针运算符调用未定义的行为

For what object pointer values does the pointer to member operator invoke undefined behavior?

本文关键字:指针 成员 运算符 调用 未定义 于什么 什么 对象      更新时间:2023-10-16

当使用指向成员运算符(->*)的指针时,对象的哪些指针值将调用未定义的行为?

具体来说,如果有问题的成员函数不访问任何成员,并且不是虚拟的,那么以下哪种情况不好?

  • 空指针
  • 指向已删除对象的指针

这个问题类似,但讨论的是常规成员函数调用。

用代码说明:

#include <iostream>     
using namespace std;     
class Foo {     
public:     
  int member(int a)     
  {     
    return a+1;     
  }     
};     
typedef int (Foo::*FooMemFn)(int);     
int main(int argc, char** argv)     
{     
  FooMemFn funcPtr = &Foo::member;     
  Foo *fStar = 0;     
  Foo *fStar2 = new Foo();     
  delete fStar2;     
  int a1 = (fStar->*funcPtr)(4);  //does this invoke UB?                                                                                                                                                                                                                             
  int a2 = (fStar2->*funcPtr)(5); //what about this?                                                                                                                                                                                                                               
  cout<<"a1: "<<a1<<"  a2: "<<a2<<endl;     
  return 0;     
}

关于未定义行为的问题是关于C++标准的问题,所以我正在寻找对C++标准部分的具体参考。

int a1 = (fStar->*funcPtr)(4);  //does this invoke UB?  
int a2 = (fStar2->*funcPtr)(5); //what about this? 

是的这两个语句都调用UB
因为它们相当于:

fStar->member(4);
fStar2->member(5);

分别。