问题描述
我正在研究 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(())
?
decltype
的规则相当简单(尤其是与许多其他规则相比) ..)。对于表达式 e
, decltype(e)
是(from [dcl.type.simple],释义) / p>
- 如果
e
是未加括号的 id-expression 那么e
的类型。正确的类型e
。我们不会丢弃 cv - 数据或引用或任何内容。decltype(ci)
是const int
,因为这是ci
。同样,decltype(cj)
是const int&
。 - code> e 是xvalue,则
T&&&
其中T
是e
的类型。 - 如果
e
是一个左值,T&
其中T
是e
的类型。 / li>
- 否则,
e
的类型。
我们按顺序通过这些要点。括号有区别的是当我们 decltype((ci))
- (ci)
id-expression ,因此我们不能简单地使用 ci
的类型。相反,它只是一个左值 - 所以我们接受表达式的类型( const int
)并添加一个引用。因此, decltype((ci))
是 const int&
。 decltype((cj))
仍然是 const int&
。
I was studying about the differences between auto
and decltype
type specifier and I saw in another question that when I use decltype
with a reference, like this:
const int ci = 0, &cj = ci;
decltype(ci) x = 0;
decltype(cj) y = x;
decltype(cj)
will not give me the type of the object that cj
refers to (that is, const int
) but will give me the type of cj
itself. So y
will be const int&
.
Why does this happen? And it could affect my code in someway? Is it related to the difference between decltype()
and decltype(())
?
The rules of decltype
are fairly straightforward (especially when compared to lots of other rules in C++...). For an expression e
, decltype(e)
is (from [dcl.type.simple], paraphrasing):
- if
e
is an unparenthesized id-expression, then the type ofe
. Exactly the type ofe
. We're not dropping cv-qualifiers or references or anything.decltype(ci)
isconst int
because that is the type ofci
. Likewise,decltype(cj)
isconst int&
. - If
e
is an xvalue, thenT&&
whereT
is the type ofe
. - If
e
is an lvalue, thenT&
whereT
is the type ofe
. - Else, the type of
e
.
We go in order through those bullet points. Where the parentheses makes a difference is when we do decltype((ci))
- (ci)
is not an unparenthesized id-expression anymore, so we don't simply take the type of ci
. Instead, it's just an lvalue - so we take the type of the expression (const int
) and add a reference to it. Hence, decltype((ci))
is const int&
. decltype((cj))
is still const int&
.
这篇关于为什么decltype定义一个变量作为参考?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!