在不存在的对象上调用静态成员函数

Kno*_*oep 4 c++ static language-lawyer

这样的事情只是出现在另一个问题中,引起了我的兴趣.鉴于此Foo声明如下:

struct Foo
{
     static void bar() {std::cout << "Bar!";}
};
Run Code Online (Sandbox Code Playgroud)

做这样的事似乎工作得很好:

std::vector<Foo> v;
v[10].bar();
Run Code Online (Sandbox Code Playgroud)

但是,这种用法实际上是否合法?如果bar()没有宣布static怎么办?

Jon*_*ely 9

做这样的事似乎工作得很好:

这并不意味着没关系.

请阅读http://c-faq.com/ansi/experiment.html,它与Roger Miller有很好的比喻:

"有人告诉我,在篮球比赛中,你无法控球并且跑动.我得到了一个篮球并尝试了它并且效果很好.他显然不懂篮球."

访问v[10]是未定义的行为.如果你在它上面调用一个成员函数也没关系,即使只是访问v[10]是未定义的.(正如评论中所指出的,即使在调用静态成员函数时也会评估对象表达式,恕我直言应该是显而易见的,因为v[10]它不会在未评估的上下文中使用,例如sizeof(v[10])decltype(v[10])).

你不能用"这似乎工作得很好"的观点来编写C++代码,并假设这意味着程序是正确的.