我正在研究auto
和decltype
类型说明符之间的差异,我在另一个问题中看到,当我使用带有引用的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(())
答案 0 :(得分:3)
decltype
的规则相当简单(特别是与C ++中的许多其他规则相比时)。对于表达式e
,decltype(e)
是(来自[dcl.type.simple],释义):
e
是未加密码的 id-expression ,那么e
的类型。确切地说是e
的类型。我们不会删除 cv - 限定符或引用或任何内容。 decltype(ci)
为const int
,因为这是ci
的类型。同样,decltype(cj)
为const int&
。e
是xvalue,那么T&&
其中T
是e
的类型。e
是左值,那么T&
其中T
是e
的类型。e
。我们按顺序通过这些要点。如果括号有所不同,那就是我们decltype((ci))
- (ci)
不再是一个不明白的 id-expression ,所以我们不要只采用{的类型{1}}。相反,它只是一个左值 - 所以我们采用表达式的类型(ci
)并添加对它的引用。因此,const int
是decltype((ci))
。 const int&
仍为decltype((cj))
。
答案 1 :(得分:2)
为什么是double const&
?嗯,这就是变量的类型。
它与decltype(())
有关吗?是,不,不是真的,两者的规则略有不同,但如果你打算使用它们,都应该理解。< / p>
decltype
和auto
是对C ++非常有用的补充,对其含义的正确理解和使用非常有用,尤其是在代码中使用它们时。在客户端类型代码中,auto
可能会更常见。
什么是decltype()
?
decltype
提供了一种机制来获取给定变量或表达式的类型。它通常具有更通用的代码,最有可能涉及模板时。
什么是auto
?
auto
实际上是一种说法&#34;我不关心类型的名称(可能太长),但我想要一个这种类型的变量&#34; ,例如for
循环中的索引器。注意; auto
,auto&
和auto&&
之间存在差异;它们在SO和其他地方(例如cppreference.com)都有详细记录。