Мы все знаем, что подобные вещи действительны в c ++:
const T &x = T();
в то время как:
T &x = T();
нет.
В недавнем вопросе разговор привел к этому правилу. ОП опубликовал некоторый код, который явно напоминает UB. Но я бы ожидал, что модифицированная версия будет работать (это модифицированная версия):
#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();
}
Это печатает мусор на некоторых машинах, 10 на других ... звучит как UB для меня :-). Но потом я подумал: «1014» - это, по сути, прославленный «1015», все, что он делает, инициализирует и читает его. Почему бы просто не позвонить A
int
и посмотреть, что произойдет:
#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();
}
Он печатает 10
каждый раз. По крайней мере, кажется , как правило ссылки на const, действующее для версии int
, но не для версии класса. Они оба просто UB из-за использования кучи? Мне просто повезло с версией int
, потому что компиляция просмотрела все const
s и просто распечатала 10
? Какой аспект правила мне не хватает?