我想到了一個奇怪的C++作弊。通常情況下,我不能從範圍走私引用,因爲我無法在包含範圍中定義未初始化的引用。但是,我可以定義一個指向包含引用的類的指針,無法初始化它,然後將它分配給一些初始化爲局部變量的動態內存的地址。即使該動態對象包含對超出範圍的變量的引用,指向對象仍然具有相同值的有效引用!即使我告訴它是-pedantic
,g ++也不會抱怨,所以我認爲它是有效的。但是,如何,爲什麼?模仿「指向引用的指針」的類可以保存作用域變量嗎?
struct int_ref
{
int &x;
int_ref(int &i): x(i) {}
};
#include <iostream>
using namespace std;
int main(void)
{
int_ref *irp;
int i = 1;
int_ref a(i); // Creates an int_ref initialized to i
irp = &a; // irp is now a pointer to a reference!
// Prints 1
cout << "irp->x = " << irp->x << " (i = " << i << ")" << endl;
i = 2;
// Prints 2
cout << "irp->x = " << irp->x << " (i = " << i << ")" << endl;
int j = 3;
int_ref b(j);
irp = &b;
// Prints 3
cout << "irp->x = " << irp->x << " (i = " << i << ", j = " << j << ")" << endl;
i = 1;
// Still prints 3
cout << "irp->x = " << irp->x << " (i = " << i << ", j = " << j << ")" << endl;
{
int k = 4;
irp = new int_ref(k);
// k goes out of scope
}
int k = 1; // Doesn't affect the other k, of course
// Prints 4 ?!
cout << "irp->x = " << irp->x << " (i = " << i << ", j = " << j << ")" << endl;
}
編輯:這實際上可以是(如在答案建議的)未確診的懸空參考。那麼如果我定義int_ref
這樣的:
struct int_ref
{
const int &x;
int_ref(const int &i): x(i) {}
};
一個const
引用不必引用到左值,所以沒有明確的一個叼着一個概念。代碼仍未定義?
這就是爲什麼他說**模仿**參考指針:) –
@Armen:他的代碼有一個評論說:「irp現在是指向參考的指針! :) –
感謝您的回答。我提出了一個關於這個問題的變種。你能看看底部的新段落嗎? (另外,重申:評論:我想我是過火的人,正如我所說,它只是模仿一個)。 –