mardi 19 septembre 2023

Palonnier MFG Crosswind

C'était ma petite folie de la rentrée : je me suis offert un palonnier MFG Crosswind, fabriqué par une toute petite boite en Croatie, mais qui envoie du pâté. Du solide, tout en métal, à part les pédales qui sont en impression 3D d'excellente qualité, avec un amortisseur optionnel (et donc essentiel). C'est un plaisir de l'utiliser, c'est d'une précision redoutable, et en plus c'est plutôt esthétique.

J'ai choisi les pédales Airbus et les pédales "chasse". Joli, non ?

Seul petit souci, le palonnier se met facilement à glisser sur la moquette, et donc je ne dois pas trop serrer l'amortisseur, sinon c'est tout qui bouge !

samedi 16 septembre 2023

Accolades et std::optional

La nouvelle manière unifiée d'initialiser les valeurs en C++, c'est super. Bim, on met deux accolades, et on a gagné. Vraiment ?

Sur le papier, c'est bath, on peut pas se tromper:

int a = {};
std::string b = {};
std::optional<int> c = {};
MonObjectQuIlEstBeau d = {};

Sauf qu'il a danger ! C'est que lorsque l'on fait un changement de type quelque part, mettons un paramètre de fonction, et que l'on s'attend à ce que le compilo nous indique gentiment tous les endroits à changer, eh bien il est possible en fait que le compilo accepte le changement sans broncher, mais en changeant la sémantique. Et boum ! C'est ce qui m'est arrivé la semaine dernière, heureusement rapidement détecté. Voyez plutôt cet innocent programme, l'on a une fonction f qui prend un optionel, et on l'appelle en initialisant notre optionel sur vide.

#include <optional>

void f(std::optional<int> a);

int main()
{
    f({});
    return 0;
}

Un peu plus tard, l'on change la signature de f:

void f(int a);

Et boum, l'on initialise maintenant a avec la valeur 0, ce qui pourrait bien être complètement faux.

Que faire alors ? Eh bien, utilisons std::nullopt ! Ainsi, notre appel f(std::nullopt) fonctionnera correctement dans le premier cas, et causera une erreur de compilation dans le deuxième.

Conclusion : mangez du {}, mais avec les optionels, préférez std::nullopt !