我想到这个问题Why can I initialize reference member with data member before initializing the data member?以及以下Why is initialization of a new variable by itself valid?这个奇怪的代码:
int main()
{
int &ri = ri;
ri = 0;
}
这段代码编译live demo,我知道这是UB,但是只是想知道,此引用实际指向的是编译器内部发生什么?
更新:当该引用是全局引用时,会发生不同的情况:godbolt,gcc似乎将其声明为指针并使其指向自身
下注者注意:我知道这段代码是无效的,并且我不希望编译器有任何特定行为,但是我认为查看内部内容可能有助于理解为什么以下代码并不非法以及引用如何以该语言工作:
struct foo {
int &ri = i;
int i = 0;
};
或者这个:
extern int i;
int &ri = i;
int i = 0;
Update2:虽然赋值绝对是UB,但如果声明本身是一个好问题:
int &ri = ri;
是否为UB。这似乎是纯粹的邪恶-ri
不能以任何方式使用,但声明本身似乎是无效的。
答案 0 :(得分:0)
不是答案,只是一个很长的评论。
我不知道您所说的”是什么意思。“ ...如果不进行强制转换,它将无法在C ++上编译。” 。
必须如何实现引用,据我所知尚未指定。但是,它们必须是伪装的指针(它们还能是什么?)。 references source和pointers source将生成完全相同的代码。
“ ...根本不需要在内存中表示,...” 我不确定我理解这意味着什么。引用的地址是它引用的对象的地址。因此,您可能会说参考文献本身没有地址。 following将打印i
的地址两次:
int i;
int &ri = i;
cout << &ri << endl << &i;
由于该语言允许使用未初始化的变量,我认为一个好的编译器必须发出警告,而不是错误: uninitialized variable used
< / em>。
[编辑]
我与参与C ++设计的人进行了简短的讨论(我忘了征求他的名字了)。简而言之,禁止T x = x;
是可取的,但是 C ++并不是从头开始设计的:它必须与C向后兼容。
因此,您找到了一种合法的方式来创建未初始化的引用。 “ ...此引用实际指向的位置?”的答案是:未初始化的指针指向的位置。