【发布时间】:2021-11-10 15:22:51
【问题描述】:
在 C++ Primer 中做练习 6.22,一个交换两个指针的函数:
void swap(int*& a, int*& b) {
auto temp = a;
a = b;
b = temp;
}
int main()
{
int a = 15;
int b = 4;
int* p1 = &a;
int* p2 = &b;
cout << "p1 address: " << p1 << "; p1 value: " << *p1 << "\np2 address: " << p2 << "; p2 value: " << *p2 << endl;
swap(p1, p2);
cout << "p1 address: " << p1 << "; p1 value: " << *p1 << "\np2 address: " << p2 << "; p2 value: " << *p2 << endl;
}
不确定它是否正确,但它按预期工作,值和地址已交换。我在 MS Visual Studio 中将鼠标悬停在 a 内的 swap 函数上:
它告诉我类型是int*&,但是将temp 的定义更改为int*& temp = a 会破坏程序:
p1 address: 004FFE00; p1 value: 15
p2 address: 004FFDF4; p2 value: 4
p1 address: 004FFDF4; p1 value: 4
p2 address: 004FFDF4; p2 value: 4
这里的正确类型是什么? MS Visual Studio 类型工具提示背后的逻辑是什么?
【问题讨论】:
-
工具提示通知您
a的类型,而不是temp。这里auto temp是int* temp而不是int* & temp。temp是否使用类型推导对a的类型没有影响。 -
temp = a需要复制指针,而不是为其创建新的别名(引用)。 -
[ProTip]
auto和模板参数永远不会推断为引用类型。如果你想要一个引用类型,你必须通过在类型后面添加&来指定它。 -
这可能是 C++ auto vs auto& 的副本。
-
@FrançoisAndrieux 傻我!但当然可以!让自己在两周后重新开始学习 C++ 很艰难,所以我变得非常生疏。感谢大家的帮助!
标签: c++ visual-c++