【问题标题】:How auto is deducing pointer type?auto 是如何推断指针类型的?
【发布时间】:2016-09-18 10:01:36
【问题描述】:

在下面的代码中,我无法理解auto 是如何知道右手边的东西是指针:

int x = 100;
int *ptr = & x;
auto test = ptr;
std::cout<<*test<<std::endl;

因为根据我的理解,指针包含的地址只不过是unsigned int,所以auto 如何推断它是指针而不是unsigned int

【问题讨论】:

  • 指针包含的地址不过是无符号整数。那是错误的。地址不一定是无符号整数。
  • 使用 auto 声明的变量的类型是从它的初始化器推导出来的。就是这样。
  • 所以这里的初始值设定项是 ptr 所以它怎么知道它必须是指针而不是其他类型
  • auto 在编译期间被评估,not 在运行时被评估,所以“指针包含”的值没有区别(不确定这个表达式甚至意味着什么) .

标签: c++ pointers auto


【解决方案1】:

您也可以问“最终,我的程序中的所有内容都是字节,那么为什么 auto 不能推断出所有内容都是 uint8_t[]?”

嗯,很简单。 ptr 的类型是 int*,所以 test 的类型也是 int*。生成的程序集看起来如何并不重要。可能是 CPU 以相同的方式处理 int*unsigned int,但这与 C++ 无关,因为 C++ 是一种高级语言

除此之外。 “指针是无符号整数”的基本陈述是不正确的。指针是一种允许读取和写入该变量中包含的内存地址的类型。 unsigned int 是... unsigned int。仅此而已,仅此而已。

【讨论】:

  • 但是如果 ptr 是 int& 然后 test 是 int 为什么引用同样的事情不起作用?
  • @Kapil 这是一个不同的、不相关的问题。
  • @Kapil 这就是自动类型推断的工作原理。您必须使用decltype(auto) 才能获得int&amp;
  • @David 谢谢理解你的回答和cmets
【解决方案2】:

标准说:

使用 auto 声明的变量的类型是从其初始化程序推导出来的。

因此,test 的类型是从ptr(即它的初始化程序)之一推导出来的,它是int *

请注意,auto 遵循几乎相同的模板类型推导规则。
autoauto&amp;const auto &amp;auto&amp;&amp;等之间的区别可以参考他们。

【讨论】:

  • 所以只是想知道如果它只是来自初始化程序那么为什么这 4 个字节被视为指针而不是 unsigned int 或其他类型
  • @Kapil 因为ptr 的类型是int* 而不是unsigned int
  • 所以你的意思是说 auto 返回并检查声明并由此推断 ptr 是 int* 所以 test 也应该是 int*
  • @Kapil 在大多数情况下,是的
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2011-02-05
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多