【发布时间】:2013-10-02 09:05:37
【问题描述】:
我之前有一个问答:Point of declaration in C++。 point-of-declaration 规则很好地适用于许多情况。现在,我对结合这条规则使用auto 感到困惑。
考虑这两个代码:
我。自己声明 x(我们不希望它起作用):
{
auto x = x;
}
二。用外部x 声明内部x (在gcc 4.8.x 中出错):
{
int x = 101; // the outer x
{
auto x = x; // the inner x
}
}
根据声明点规则,它应该可以工作,但不能。似乎标准中还有一条我错过了的规则。问题是,使用auto时的声明点在哪里?
有两种可能:
我。如果声明点在=之后,则在语句末尾:
auto object = expression;
^
Is it here? If it is, why gcc complains?
所以第二个声明是有效的并且必须有效,因为没有x 而是那个外部声明(之前声明过)。因此auto x=x 是有效的,内部的x 应该分配给101。
二。如果声明点在=之前:
auto object = expression;
^
好吧,这没有任何意义,因为auto 必须等到看到下面的表达式。例如auto x; 无效。
更新:我需要一个通过规则声明点解释它的答案。
【问题讨论】:
-
auto x = x失败,因为x解析为本地x(即auto x),但尚未推断出x的类型。就像int y = y中的y解析为int y一样。 -
@Simple:我的问题是,为什么它会解析到本地。
-
@Simple:跟随问题this。
auto x=x当x已经定义时应该可以工作。 -
我不知道问题出在哪里。
x在auto x之后的范围内,但它还没有已知类型;尝试使用x作为初始化程序会导致错误,因为x还没有类型。 -
@MM。 “所以内部范围内没有
x”是错误的。仅仅因为它还没有类型并不意味着它不存在。