为什么decltype将变量定义为引用?

时间:2015-08-29 17:48:09

标签: c++ c++11

我正在研究autodecltype类型说明符之间的差异,我在另一个问题中看到,当我使用带有引用的decltype时,就像这样:

const int ci = 0, &cj = ci;
decltype(ci) x = 0;
decltype(cj) y = x; 

decltype(cj)不会向我提供cj引用的对象的类型(即const int),但会给我cj本身的类型。因此y将是const int&

为什么会这样?它可能会影响我的代码吗?它与decltype()decltype(())

之间的差异有关吗?

2 个答案:

答案 0 :(得分:3)

decltype的规则相当简单(特别是与C ++中的许多其他规则相比时)。对于表达式edecltype(e)是(来自[dcl.type.simple],释义):

  • 如果e是未加密码的 id-expression ,那么e的类型。确切地说是e的类型。我们不会删除 cv - 限定符或引用或任何内容。 decltype(ci)const int,因为这是ci的类型。同样,decltype(cj)const int&
  • 如果e是xvalue,那么T&&其中Te的类型。
  • 如果e是左值,那么T&其中Te的类型。
  • 否则,e
  • 的类型

我们按顺序通过这些要点。如果括号有所不同,那就是我们decltype((ci)) - (ci)不再是一个不明白的 id-expression ,所以我们不要只采用{的类型{1}}。相反,它只是一个左值 - 所以我们采用表达式的类型(ci)并添加对它的引用。因此,const intdecltype((ci))const int&仍为decltype((cj))

答案 1 :(得分:2)

为什么是double const&嗯,这就是变量的类型。

它与decltype(())有关吗?​​是,不,不是真的,两者的规则略有不同,但如果你打算使用它们,都应该理解。< / p>

decltypeauto是对C ++非常有用的补充,对其含义的正确理解和使用非常有用,尤其是在代码中使用它们时。在客户端类型代码中,auto可能会更常见。

什么是decltype()

decltype提供了一种机制来获取给定变量或表达式的类型。它通常具有更通用的代码,最有可能涉及模板时。

什么是auto

auto实际上是一种说法&#34;我不关心类型的名称(可能太长),但我想要一个这种类型的变量&#34; ,例如for循环中的索引器。注意; autoauto&auto&&之间存在差异;它们在SO和其他地方(例如cppreference.com)都有详细记录。