(相当基本的问题:)我发现以下两种方式都会生成int *
类型。我可以知道哪一个更合适吗?
int i = 42;
auto a = &i;
auto *b = &i;
(我试图将指针示例与参考示例相关联:auto c = i;
和auto &d = i;
。但似乎这个类比在这里不起作用。)
编辑: 我还发现了另一个(密切相关的)奇怪的例子:
auto i = 42, p = &i; // fails at compilation
auto i = 42, *p = &i; // passes at compilation
为什么呢?在这两种情况下,初始化程序都具有相同的基本类型int(这应该使两种情况都通过),不是吗?
答案 0 :(得分:1)
IMO没有一个真的"正确",因为所有这些都难以阅读/理解而无法查找i
的实际类型。所以只需使用int *c = &i;
即可。如果您不确定稍后更改的类型,请使用自定义类型的typedef
而不是int
。
就我个人而言,我试图尽量避免使用auto
,除非它真的像for()
循环中的迭代器那样孤立或容易理解。
修改:如果你真的 使用auto
出于某种原因(让我们假设一些更复杂的情况),那么我&#39 ; d绝对使用auto a = ...
而不是auto *a = ...
。在没有专门定义指针的情况下,您可以用提供类似接口的东西替换实际的数据类型,例如,从原始指针切换到智能指针 - 您不限于传递/存储原始指针。
编辑2 :考虑您的补充:
auto i = 42, p = &i; // fails at compilation
这不会编译?很明显。如果在一行中声明多个变量,则所有变量都将获得相同的数据类型。在这里使用auto
并不意味着每个条目都会重新评估auto
的实际含义。相反,它适用于所有",如果失败(这就是这种情况),它就不会编译。
如果将强制转换添加到表示所分配的实际类型的赋值中,则会更加明显:
auto i = (int)42, p = (auto*)&i;
现在auto
已解析为int
:
int i = (int)42, p = (int*)&i;
将其拆分为两行以使其更加明显:
int i = (int)42;
int p = (int*)&i; // Whoopsie!
答案 1 :(得分:0)
我肯定会一直跟着:
auto a = &i;
它不那么模糊,因为“a”的类型必须包含一个地址。它是一个指针。
这更加模糊:
auto *b = &i;
那就是说b的内容必须是int,使b成为int *(更难以可视化)
int i = 42;
auto a = &i; // auto resolves to an int*
auto *b = &i; // auto resolves to an int (contents of b is int), b is an auto* aka int*
auto i = 42, p = &i; // auto resolves to an int, then p must also be an int (whoops mixing types).
auto i = 42, *p = &i; // auto resolves to an int, p is an auto* aka an int*