The minimal example above does compile...
But what you really meant to ask was "why doesn't it compile when I reference foo::b"?
It's because all const members must be initialised in a constructor (and indeed in the initialisation list of the constructor, not in the body).
As of c++11 you can provide default values in the class definition:
#include <iostream>
struct foo
{
static const char* const a[30]; // compiles
const char* const b[30] = {"Hello", "World" /*insert others here */ };
};
const char* const foo::a[30] = {
"Hello", "Cruel", "World", /* etc */
};
int main()
{
foo f;
std::cout << f.b[0] << std::endl;
std::cout << f.a[2] << std::endl;
return 0;
}