对于什么对象指针值,指向成员的指针运算符调用未定义的行为
For what object pointer values does the pointer to member operator invoke undefined behavior?
当使用指向成员运算符(->*)的指针时,对象的哪些指针值将调用未定义的行为?
具体来说,如果有问题的成员函数不访问任何成员,并且不是虚拟的,那么以下哪种情况不好?
- 空指针
- 指向已删除对象的指针
这个问题类似,但讨论的是常规成员函数调用。
用代码说明:
#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);
分别。
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队