Plutôt que d'utiliser un global, je dirais qu'il est préférable d'utiliser un statique locale. Comme l'initialisation de votre vecteur a lieu avant que le principal ne soit entré, aucune exception ne sera interceptée par main. Disons, par exemple, vous avez un type qui, lorsqu'il est construit peut jeter une exception:
class A {
public:
A() {
// ... code that might throw an exception
}
};
Pour l'initialisation suivante, le try/catch dans le corps principal ne sera pas attraper l'exception lancée par le constructeur, et ainsi votre Le programme va simplement mourir immédiatement et vous ne pourrez probablement même pas utiliser un débogueur pour trouver la cause!
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 (...) {
}
}
Une autre approche qui va attraper une exception du constructeur est d'utiliser une statique locale - qui est initialisé en utilisant la technique proposée par ce answer.
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 (...) {
}
}
Que dire celle-ci: std :: vecteur un (3, 100), et a_init ((a [0] = 98, a [1] = 99, a)); il va faire un égal à "98, 99, 100" :) –
Juste par curiosité, pourquoi avez-vous besoin? –