Supposons que j'ai les éléments suivants :
#include <memory>
struct A { int x; };
class B {
B(int x, std::unique_ptr<A> a);
};
class C : public B {
C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {}
};
Si je comprends correctement les règles du C++ concernant "l'ordre non spécifié des paramètres de fonction", ce code n'est pas sûr. Si le deuxième argument de B
est d'abord construit à l'aide du constructeur de move, puis de a
contient maintenant un nullptr
et l'expression a->x
déclenchera un comportement non défini (probablement une erreur de segmentation). Si le premier argument est construit en premier, alors tout fonctionnera comme prévu.
Si c'était un appel de fonction normal, nous pourrions simplement créer un temporaire :
auto x = a->x
B b{x, std::move(a)};
Mais dans la liste d'initialisation des classes, nous n'avons pas la liberté de créer des variables temporaires.
Supposons que je ne puisse pas changer B
Est-ce qu'il y a un moyen possible d'accomplir ce qui précède ? A savoir déréférencer et déplacer un unique_ptr
dans la même expression d'appel de fonction sans créer un temporaire ?
Et si vous pouviez changer B
mais n'ajoute pas de nouvelles méthodes telles que setX(int)
? Cela aiderait-il ?
Merci.