使用成员初始值设定项列表初始化类对象的引用变量?



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指的是k1k1指的是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没有警告。

相关内容

  • 没有找到相关文章

最新更新