加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:09:14 所属栏目:百科 来源:网络整理
导读:(相当基本的问题:)我发现以下两种方式都会生成int *类型.我可以知道哪一个更合适吗? int i = 42;auto a = i;auto *b = i; (我试图将指针示例与参考示例相关联:auto c = i;和auto d = i ;.但似乎这里的类比不起作用.) 编辑: 我还发现了另一个(密切相关的)
(相当基本的问题:)我发现以下两种方式都会生成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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读