gpt4 book ai didi

c++ - 调用不通过空指针访问成员的非静态方法是否合法/定义明确的 C++?

转载 作者:可可西里 更新时间:2023-11-01 18:05:45 27 4
gpt4 key购买 nike

我最近遇到了以下代码:

class Foo
{
public:
void bar();
// .. other stuff
};

void Foo::bar()
{
if(!this) {
// .. do some stuff without accessing any data members
return;
}

// .. do normal actions using data members
}

代码可以编译,因为在 C++ 中,方法只是隐式传递一个指向“this”的指针的函数,并且可以像任何其他指针一样检查“this”是否为 NULL。很明显,这段代码很困惑,而且是不好的做法,即使它不会崩溃;在调试器中单步执行代码会非常困惑,看到一个 NULL 指针即将调用一个方法,然后却看不到预期的崩溃。我的问题是:在 SomeFooPtr == NULL 处调用 SomeFooPtr->bar() 是否违反了 C++ 标准?

我突然想到,这可能不是因为用户定义的运算符-> 返回一个指针,这意味着即使该指针为 NULL,它也肯定没有被取消引用(取消引用 NULL 指针我确定被视为标准为非法或未定义)。另一方面,原始指针的语义不一定必须与用户定义指针的语义相匹配——也许它们上的 operator-> 被认为是取消引用,即使编译器不会生成。

最佳答案

这可能适用于大多数系统,但它是未定义的行为。引用标准:

5.2.5.3

If E1 has the type “pointer to class X,” then the expression E1->E2 is converted to the equivalent form (*(E1)).E2 [...]

和:

5.2.5.1

A postfix expression followed by a dot . or an arrow ->, optionally followed by the keyword template (14.8.1), and then followed by an id-expression, is a postfix expression. The postfix expression before the dot or arrow is evaluated;58) [...]

58) This evaluation happens even if the result is unnecessary to determine the value of the entire postfix expression, for example if the id-expression denotes a static member.

*x 的评估,其中 x 是一个空指针,导致未定义的行为,所以你的显然是 UB 的情况,甚至在输入函数之前。

关于c++ - 调用不通过空指针访问成员的非静态方法是否合法/定义明确的 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257393/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com