下面哪一个是更合适的方式" auto"推导出指针类型?

时间:2014-07-05 20:35:04

标签: c++ c++11

(相当基本的问题:)我发现以下两种方式都会生成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(这应该使两种情况都通过),不是吗?

2 个答案:

答案 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*