c – 下面哪一个是“自动”推导指针类型的更合适的方法?

(相当基本的问题:)我发现以下两种方式都会生成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!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...