(相当基本的问题:)我发现以下两种方式都会生成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(这应该使两种情况都通过),不是吗?
解决方法
IMO没有一个真正“合适”,因为所有这些都难以阅读/理解而无法查找i的实际类型.所以只需使用int * c =& i;.如果您不确定稍后更改类型,请使用自定义类型而不是int的typedef.
就我个人而言,我试图尽可能地避免使用auto,除非它真的像for()循环中的迭代器一样孤立或易于理解.
编辑:如果你真的因为某种原因必须使用auto(让我们假设一些更复杂的场景),那么我肯定会使用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!