什么时候取消引用指针会导致在 C++ 中创建副本?

When does dereferencing a pointer cause a copy to be made in c++?

基本上我很好奇取消引用指针会导致创建副本。据我了解,指针是一种高级构造,如果您取消引用引用变量,它不会生成副本,但如果您取消引用变量,它会生成副本。

所以这不会复制:

int num = 10;
int *ptr = #
int& num2 = *ptr;

但这会:

int num = 10;
int *ptr = #
int num2 = *ptr;

对吗?如果有的话,引用到底什么时候会导致复制?

单独取消引用永远不会复制。尽管取消引用指针只是应用 * 运算符,并且您的代码中发生了更多事情。

这里:

int num = 10;
int *ptr = #
int& num2 = *ptr;

最后一行解引用指针并使用结果初始化引用num2num2 现在引用 num。没有副本。

这里:

int num = 10;
int *ptr = #
int num2 = *ptr;

在最后一行中,您首先推导 ptr 然后使用结果来初始化 num2。由于 num2 是一个值,因此制作了一个副本。

您不需要指针也能看到相同的效果:

int x = 42;
int& y = x;   // no copy, y is an alias for x
int z = x;    // z is a copy of x