我们都知道这样的事情在 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
anint
看看会发生什么:
#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 并直接打印出 a10
吗?我错过了规则的哪个方面?