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

时间:2014-11-19 08:46:43

标签: c++ gcc static clang null-pointer

#include <iostream>

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

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

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

我只关心GCC(G ++)和Clang。

有没有保证这两个编译器允许这个作为编译器功能/规范/扩展?

2 个答案:

答案 0 :(得分:0)

我既不能在list of gcc's C++ extensions也不能在corresponding list for clang.找到这个,所以我要说你无法保证这对任何一个编译器都有用。

答案 1 :(得分:0)

没有任何迹象表明这会奏效。如果您决定使用它,由您决定它确实适用于您正在使用它的实际架构。重要的是要反思代码生成,空指针使用(等等)的调试陷阱以及所有编译器中的优化都是“目标系统相关的” - 所以它可能在x86上工作,但在MIPS上却没有,作为一个例子。或者它可能在编译器的X + 0.0.1版本中以某种方式停止工作。

话虽如此,我希望这个特定的例子能够在任何体系结构上完美地运行,因为this不会在任何地方使用。

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