Nous savons tous que les choses de ce genre sont valides en C++:référence à const bizarrerie temporaire
const T &x = T();
tout:
T &x = T();
est pas.
Dans a recent question, la conversation mène à cette règle. L'OP avait posté du code qui évoque clairement UB. Mais je devrais attendre une version modifiée de celui-ci au travail (Ceci est la version modifiée):
#include <iostream>
using namespace std;
class A {
public:
A(int k) { _k = k; };
int get() const { return _k; };
int _k;
};
class B {
public:
B(const A& a) : _a(a) {}
void b() { cout << _a.get(); }
const A& _a;
};
B* f() {
return new B(A(10));
}
int main() {
f()->b();
}
Ce imprime des documents inexploitables sur certaines machines, 10 sur les autres ... sonne comme UB pour moi :-). Mais alors je pensais, bien A
est fondamentalement glorifié int
tout ce qu'il en fait initialiser un et le lire. Pourquoi ne pas simplement appeler A
un int
et voir ce qui se passe:
#include <iostream>
using namespace std;
typedef int A;
class B {
public:
B(const A& a) : _a(a) {}
void b() { cout << _a; }
const A& _a;
};
B* f() {
return new B(A(10));
}
int main() {
f()->b();
}
Il imprime 10
chaque fois. Il au moins semble comme la règle de référence const est en vigueur pour la version int
, mais pas pour la version de classe. Sont-ils tous deux simplement UB en raison de l'utilisation du tas? Suis-je juste chanceux avec la version int
parce que la compilation a vu à travers tous const
s et a juste imprimé directement un 10
? Quel aspect de la règle me manque?
Je vous suggère de remplacer "une référence const" par "une référence const locale *" pour rendre les choses encore plus claires;) – fredoverflow
@FredOverflow: Pourquoi insistez-vous sur une référence * locale *? Vous pouvez légalement déclarer 'const std :: string & r =" Hello "' à la portée de l'espace de noms et obtenir la même extension de durée de vie. – AnT
@AndreyT, comment ce * lien * s'établit-il à quel niveau? –