mercredi 30 avril 2014

De g++4.4 à g++4.8

Je suis en train de passer un bon bout de code (environ 2 million de lignes de code) de g++4.4 à g++4.8. Rien de trop méchant, mais quelques points intéressants à noter dans l'implémentation de C++11.

Le changement qui m'a le plus impacté est celui de std::make_pair. La signature de cette fonction est passée de std::make_pair(const T & left, const U & right) à std::make_pair(T left, T right), pour finalement devenir std::make_pair(T && left, T && right). La différence est double.

D'une part, il faut surtout laisser le compilo dériver les types templates. Un std::make_pair(x, y) ne compilera pas, il faut faire std::make_pair(x, y). En effet, écrire std::make_pair<int, int> réduit les paramètres de références universelles T && à rvalue int &&, et les lvalues ne passent plus. C'est particulièrement gonflant dans les std::bind qui ne peuvent donc plus utiliser std::make_pair. Ça tombe bien, les lambdas débarquent.

D'autre part, la conversion de type ne se fait plus. Alors qu'il était possible de faire, par exemple,

std::pair<int, std::shared_ptr<std::string> > = 
std::make_pair(1, new std::string("abc"))
, la conversion de std::string * en std::shared_ptr<std::string> ne se fait plus implicitement. Il faudra donc taper
std::pair<int, std::shared_ptr<std::string> > = 
std::make_pair(1, std::make_shared<std::string>("abc"))
.

Aucun commentaire: