このようなことがC++で有効であることは誰もが知っています。
const T &x = T();
その間:
T &x = T();
ではありません。
最近の質問では、会話がこのルールにつながります。OPは、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のように聞こえます:-)。しかし、それから私は、それがそれを初期化してそれを読むことをするすべてA
が基本的に栄光であると思いました。に電話して何が起こるか見てint
みませんか: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
確認し、直接印刷したので、私はバージョンに幸運10
ですか?ルールのどの側面が欠けていますか?