C++静态const通过NULL指针访问

sir*_*rg3 12 c++ static pointers

class Foo {
public:
 static const int kType = 42;
};

void Func() {
 Foo *bar = NULL;
 int x = bar->kType;
 putc(x, stderr);
}
Run Code Online (Sandbox Code Playgroud)

这是定义的行为吗?我阅读了C++标准但是找不到任何关于访问静态const值的内容......我已经检查了GCC 4.2,Clang ++和Visual Studio 2010生成的程序集,并且它们都没有执行NULL的解引用指针,但我想确定.

Mic*_*urr 10

您可以使用指针(或其他表达式)来访问静态成员; 但是,遗憾的是,通过NULL指针这样做是官方​​未定义的行为.从9.4/2"静态成员":

可以使用qualified-id表达式X :: s来引用类X的静态成员; 没有必要使用类成员访问语法(5.2.5)来引用静态成员.可以使用类成员访问语法来引用静态成员,在这种情况下,评估对象表达式.

基于以下示例:

class process {
public:
    static void reschedule();
};

process& g();

void f()
{
    process::reschedule();   // OK: no object necessary
    g().reschedule();        // g() is called
}
Run Code Online (Sandbox Code Playgroud)

目的是允许您确保在此方案中调用函数.

  • 我要拆分头发并指出"评估对象表达式"并不一定意味着*解除引用指针* - 它只是意味着找到指针值 - 但是看看§5.2.5,它似乎它*做*,因为在这种情况下"object-expression"被定义为"`*bar`",而不仅仅是"`bar`".所以你是对的. (4认同)
  • @Potatoswatter:我相信我的解释是正确的,但我当然不认为自己是权威.虽然我认为通过适当类型的NULL指针调用静态成员函数的可能性可能会像您预期的那样工作,但是使用类型名称而不是指针进行调用很容易(尽管我认为是模板这可能并不总是真的,所以你可能最好不要使用指针. (2认同)