Est-ce portable ou au moins sûr à utiliser avec g ++?C++ l'ordre d'initialisation des globales
#include <iostream>
#include <vector>
struct c {};
std::vector<c*> v;
struct i : c { i() { v.push_back (this); } } a, b, c;
int main() {
std::cout << v.size() << "\n"; // outputs 3 with g++
}
EDIT:
Ok, ce que je dois avéré être un peu plus difficile: le même code avec les modèles:
#include <iostream>
#include <vector>
template < typename T > struct c {};
template < typename T > struct cv { static std::vector<c<T>*> v; };
template < typename T > std::vector<c<T>*> cv<T>::v;
template < typename T > struct i : c<T> { i() { cv<T>::v.push_back (this); } };
cv<int> dummy; // even this won't initialize cv<int>::v
i<int> a, b, d;
int main() {
std::cout << cv<int>::v.size() << "\n"; // outputs 0 :-(
}
Comment pourrais-je résoudre ce problème à travailler comme ci-dessus ?
EDIT 2:
Voici une solution laide avec des macros (je l'espère, il y a une meilleure façon de le faire):
#include <iostream>
#include <vector>
template < typename T > struct c {};
template < typename T > struct cv;
#define INITCV(X) \
struct v##X { static std::vector<c<X>*> v; }; \
std::vector<c<X>*> v##X::v; \
template <> struct cv<X> { typedef v##X V; }
template < typename T > struct i : c<T> { i() { cv<T>::V::v.push_back (this); } };
INITCV(int);
i<int> a, b, d;
int main() {
std::cout << cv<int>::V::v.size() << "\n"; // outputs 3 again :-)
}
(BTW, dois-je ai posté une nouvelle question au lieu des modifications?)
Merci d'avoir cherché dans la spécification. Malheureusement, cela ne semble pas s'appliquer aux modèles, comme dans ma question modifiée. – Thomas