Lors de l'exécution du code suivant sur gcc 8 (https://wandbox.org/, avec "g ++ prog.cc -Wall -Wextra std = C++ 1z"):élément de référence de liaison ++ C au paramètre de constructeur
#include <iostream>
class B{
public:
B(): copy(false){ std::cout << "B-constructed" << std::endl;}
B(const B& b): copy(true){ std::cout << "B-copy-constructed" << std::endl; }
~B(){ std::cout << (copy?"B-destructed":"B-(copy)-destructed") << std::endl;}
bool copy;
};
class A{
public:
A(B b): bref(b){std::cout << "A-constructed" << std::endl;}
~A() {std::cout << "A-destructed" << std::endl;}
B &bref;
};
void f(){
B b;
A a(b);
std::cout << "f over" << std::endl;
}
int main()
{
f();
std::cout << "main over" << std::endl;
return 0;
}
ce qui suit la sortie est cédée:
B-constructed
B-copy-constructed
A-constructed
B-destructed
f over
A-destructed
B-(copy)-destructed
main over
L'ordre de destruction des objets semble inhabituel. C'est comme si la durée de vie du paramètre du constructeur était étendue. Est-ce que la norme dit quoi que ce soit à propos de la référence des membres aux paramètres constructeurs?
Je ne pense pas que cette citation de la norme applique, comme le paramètre est un objet temporaire (mais je ne sais pas à la définition d'une « expression temporaire »):
Une expression temporaire lié à un membre de référence dans un mem-initializer est mal formé. [Exemple:
struct A {
A(): v (42) {} // erreur
const int & v;
};
exemple -end]
Vous mélangé les chaînes dans '~ B': si elle est une copie, dire qu'il est normalement détruit, sinon, dire qu'il est la copie destructed –
Alors, quelle est la question alors? Que pensez-vous qui ne va pas avec l'ordre de construction/destruction, après que ce soit réglé? –
Maintenant, la commande semble bien. Cependant, la question qui reste est de savoir si la norme dit quoi que ce soit sur la liaison des références membres aux paramètres constructeurs. – user42768