【问题标题】:What is the difference between Automatic type deduction in C++11 and type castingC++11中的自动类型推导和类型转换有什么区别
【发布时间】:2018-05-24 11:56:41
【问题描述】:

我对 C++11 中引入的“auto”关键字和类型转换 (dynamic_cast/static_cast) 这两个概念感到困惑。

C++11 中的“auto”关键字是否在内部使用类型转换?

【问题讨论】:

  • 它使用模板规则来确定类型。
  • auto 实际上只是为您“推导出”类型,因此您不必自己编写它,它永远不会自行更改值的类型。它只能用于编译器可以从上下文推断类型的地方 (more info here)。类型转换涉及更改值的类型,您必须在程序中告诉您要将值用作的新类型是什么(更多信息 herehere)。
  • 这是两个不同的概念。当您想将某种类型的值视为另一种类型的值(例如,将整数值视为浮点值)时,使用强制转换。类型推导允许你推导类型,例如当你想声明一个变量的类型是其初始化表达式auto i = 1;
  • auto 的优点之一是通过使用它,您可以确定在初始化它时不会有任何隐式转换。这几乎与演员阵容相反。也许您将autostd::any 混淆了?

标签: c++ c++11 auto typecasting-operator


【解决方案1】:

让我们用一个例子来保持简单

unsigned short s = 65535;
auto positive = s;
auto negative = (short) s;

std::cout << positive << std::endl; // prints 65535
std::cout << negative << std::endl; // prints -1

在这段代码中:

  • 在第一行中,您只需使用值 655355 初始化一个 unsigned short 变量
  • 在第二行中初始化变量positive,然后让编译器从它的初始化器中推断出它的类型(参见link)。因此positive 将是unsigned short,因为它的初始化器具有那种类型。
  • 在第三行中,negative 的类型将被推断为short,因为您将s 的类型从unsigned short 转换为short

请注意,positivenegative 变量将保持相同的值,十六进制为 0xffff,但由于它们的类型,它们的解释方式不同。

因此,auto 和 cast 之间没有区别,就好像它们是可比较的一样,它们是不同的概念。

  • auto 会根据一定的规则推导出类型或者你的变量
  • 强制转换会改变变量的类型

我建议您阅读 Scott Meyers 的Effective Modern C++,了解 auto 的工作原理。

【讨论】:

  • 也许这是一个不好问的地方,但是那本书推荐适合初学者吗?我把它放在我的阅读清单上,但我认为它更高级。
  • 好吧,也许你是对的,但他对类型推导给出了很好的解释。
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 2011-05-02
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多