Вместо того, чтобы использовать глобальный, я бы посоветовал использовать локальную статику. Поскольку инициализация вашего вектора происходит до того, как будет введено main, любые сгенерированные исключения не будут перехвачены main. Например, у вас есть тип, который при его создании может выдать исключение:
class A {
public:
A() {
// ... code that might throw an exception
}
};
Для следующей инициализации try / catch в теле main не будет перехватывать исключение, сгенерированное конструктором, и поэтому ваша программа просто сразу же умрет, и вы, вероятно, даже не сможете использовать отладчик для поиска причина!
std::Vector<A> v(5, A()); // May throw an exception here not caught by main
int main () {
try {
// Exception for 'v' not handled here.
}
catch (...) {
}
}
Альтернативный подход, который поймает исключение из конструктора, заключается в использовании локальной статики - которая инициализируется с использованием техники, предложенной этим ответом .
std::Vector<A> init (); // Returns a vector appropriately initialized
std::vector<A> & getV () {
static std::vector<A> cache = init();
return cache;
}
int main () {
try {
getV().at[0]; // First call to getV - so initialization occurs here!
}
catch (...) {
}
}