针对此问题的一个后续问题。
我们有以下代码:
#include <iostream>
struct A
{
static int n;
};
int A::n = 5;
int main()
{
A* a; //uninitialized on purpose
std::cout << a->n; //UB?
}
这种访问方式是否是未定义行为?一方面,访问静态类成员不需要对象,另一方面,对未初始化的指针使用operator->
容易出问题。
注意:GCC和MSVC编译此代码时没有任何警告,而Clang则对未初始化的使用进行了投诉。 https://godbolt.org/z/Gy5fR2
*
应用于空指针是否是UB(未定义行为),所以这两个问题是不同的。 - Brian Bi