auto关键字的声明点

mas*_*oud 16 c++ c++11

我之前有一个问答:C++中的声明点.规则的声明点很适用于许多情况.现在,我对auto这个规则的组合使用感到困惑.

考虑这两个代码:

一世.声明x本身(我们不希望它的工作):

{
  auto x = x;
}
Run Code Online (Sandbox Code Playgroud)

II.x通过外部声明内部x (它在gcc 4.8.x中产生错误):

{
  int x = 101; // the outer x
  {
    auto x = x; // the inner x
  }
}
Run Code Online (Sandbox Code Playgroud)

根据宣言点的规则,它应该有效,但事实并非如此.似乎标准中有另一条规则我错过了它.问题是,使用时的声明点在哪里auto

 

有两种可能性:

一世.如果声明点在声明=结尾之后:

auto object = expression;
                        ^
                        Is it here? If it is, why gcc complains?
Run Code Online (Sandbox Code Playgroud)

所以第二个声明是有效的并且必须有效,因为x除了那个外部声明(之前声明).因此auto x=x是有效的,内部x应该被分配101.

 

II.如果声明点在之前=:

auto object = expression;
           ^
Run Code Online (Sandbox Code Playgroud)

好吧,它没有任何意义,因为auto必须等到看到下面的表达式.例如auto x;无效.


更新:我需要一个答案,通过声明的规则来解释它.

Mar*_*cia 19

auto x = x; // inner x
Run Code Online (Sandbox Code Playgroud)

是不正确的.

引用C++ 11标准(强调我的):

7.1.6.4自动说明符

...

3否则,变量的类型是从其初始化程序推导出来的.声明的变量的名称不应出现在初始化表达式中....

所以因为x=解析到xauto x(如在你链接的问题解释),上面这段代码是非法的构造.

  • 啊,很高兴看到标准有远见,不仅仅是将其留给其他规则的副产品. (3认同)

Sim*_*ple 10

就像在任何其他类型的定义中一样,x初始化器的右侧auto x = x解析为本地auto x.C++总是这样做(即int x = x编译,但会给你未定义的行为).

auto x = x无法编译的原因是因为虽然x在范围内它还没有已知类型,因此使用它作为初始化失败,因为无法从表达式推断出类型.

就像任何其他类型的声明一样,x在其声明者之后的范围内auto x.

int x = 10;
int y = 20;
{
    int x = x;  // This is NOT the outer x. This is undefined behaviour (reading an
                // uninitialised variable).
    auto y = y; // This is NOT the outer y. This is a compile error because the type of
                // y is not known.
}
Run Code Online (Sandbox Code Playgroud)


seh*_*ehe 5

只需添加一个具有更明确诊断的示例:

auto ll = [&] { ll(); };
Run Code Online (Sandbox Code Playgroud)

(gcc) 中的结果:

error: variable ‘auto ll’ with ‘auto’ type used in its own initializer
Run Code Online (Sandbox Code Playgroud)

或(叮当声):

error: variable 'll' declared with 'auto' type cannot appear in its own initializer
    auto ll = [&] { ll(); };
                    ^
Run Code Online (Sandbox Code Playgroud)

您可以看到对此有明确的规则。我没看过规格。