https://stackoverflow.com/a/8523361/11862989 从这个答案中得出这个问题。我觉得自己很渺小 那个答案有问题,所以我在那里发表了评论,但没有他的回复(我指的是谁的答案(家伙(190K 声誉)我指的是他的答案),所以我在这里问一小部分。
1.
.h
struct A
{
private:
int &i;
public:
A(int);
};
。.cpp
A::A(int k1): i(k1)
{
std::cout<<&k1<<" "<<k1<<"n";
std::cout<<&i<<" "<<i<<"n";
}
主.cpp
int main()
{
int x=99;
std::cout<<&x<<" "<<x<<"n";
A a1(x);
}
输出
0x72fe0c 99
0x72fde8 99
0x72fde8 99
阿拉伯数字。
.h
struct A
{
private:
int &i; // __change__
public:
A(int&);
};
。.cpp
A::A(int &k1): i(k1) // __change__
{
std::cout<<&k1<<" "<<k1<<"n";
std::cout<<&i<<" "<<i<<"n";
}
主.cpp
int main()
{
int x=99;
std::cout<<&x<<" "<<x<<"n";
A a1(x);
}
输出
0x72fe0c 99
0x72fe0c 99
0x72fe0c 99
在第二个代码中,因为我们通过 main 传递x
的引用,它由k1
收集。 现在我们将k1
的引用传递给i
。 表示现在i
指的是k1
,k1
指的是x
。 间接表示i
指的是x
我说得对吗?
首先,我认为这里的变量x
的值通过main传递,它由变量k1
收集,然后将k1
的引用传递给变量i
。 所以在这种情况下,变量i
指的是变量k1
但变量k
不是指变量x
我说得对吗?
那个家伙(190K 声誉)我在顶部提到了他的答案,他使用了第 1 种方法来做到这一点,我认为他错了,__2nd__method初始化类中对象的引用变量是正确的。 我说得对吗?
你是对的,很好的收获。你提到的答案中的阿洛克的例子是有缺陷的。您的示例已经表明了这一点,并且引用过时引用的未定义行为的可能后果可以在此 godbolt 示例中看到。我公开了 A::i 并将主要功能更改为
int main()
{
int x = 99;
cout << &x << " " << x << "n";
A a1(x);
cout << a1.i << " " << "n";
cout << a1.i << " " << "n"; // not 99 any more!
}
示例中的输出为
0x7fff6983d4dc 99
0x7fff6983d4b4 99
0x7fff6983d4b4 99
99
32767
第一个输出在堆栈上创建足够的操作来覆盖地址&a1.i
,当时该地址包含本地k1
。
一个聪明的编译器可以检测到这一点并发出警告;事实上,Clang说warning: binding reference member 'i' to stack allocated parameter 'k1' [-Wdangling-field]
GCC 10.2没有警告。