C++ GCC/Clang是否允许通过空指针访问静态成员?

C++ GCC/Clang是否允许通过空指针访问静态成员?,c++,gcc,static,clang,null-pointer,C++,Gcc,Static,Clang,Null Pointer,我知道这是标准不允许的。但是,具体的编译器呢 我只关心GCCG++和叮当声 是否有任何保证这两个编译器允许将此作为编译器功能/规范/扩展?我在或中都找不到,因此我想说,您不能保证这两个编译器都能工作。没有任何证据表明这会工作。如果您决定使用它,就由您来确定它是否真的适用于您正在使用它的实际体系结构。考虑到所有编译器中的代码生成、空指针使用的调试陷阱等和优化都依赖于目标系统,这一点很重要,因此它可以在x86上工作,但不能在MIPS上工作,例如。或者,在编译器的X+0.0.1版本中,它可能以某种方式

我知道这是标准不允许的。但是,具体的编译器呢

我只关心GCCG++和叮当声


是否有任何保证这两个编译器允许将此作为编译器功能/规范/扩展?

我在或中都找不到,因此我想说,您不能保证这两个编译器都能工作。

没有任何证据表明这会工作。如果您决定使用它,就由您来确定它是否真的适用于您正在使用它的实际体系结构。考虑到所有编译器中的代码生成、空指针使用的调试陷阱等和优化都依赖于目标系统,这一点很重要,因此它可以在x86上工作,但不能在MIPS上工作,例如。或者,在编译器的X+0.0.1版本中,它可能以某种方式停止工作

话虽如此,我希望这个特定的示例在任何体系结构上都能很好地工作,因为它没有在任何地方使用


请注意,仅仅因为某些东西是未定义的,并不一定意味着它会崩溃、失败,甚至不能完全按照您的预期工作。但是,它确实允许编译器生成编译器想要的任何代码,包括导致计算机崩溃、硬盘格式化等的代码。

这更多的是一种副作用,而不是功能。可能在调试模式下,可以检查空指针的结构成员的访问。在发行版中,这可能是一个沉重的负担。您正在调用一个静态函数,所以空指针甚至没有被使用。如果它不是一个静态函数,那么它仍然可能工作,因为不需要通过空指针寻址任何内存。然而,我认为这种行为仍然没有定义。
#include <iostream>

struct Foo { static auto foo() -> int { return 123; } };

int main() {
    std::cout << static_cast<Foo*>(nullptr)->foo() << std::endl;
    return 0;
}