我之前有一个问答: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后=解析到x中auto x(如在你链接的问题解释),上面这段代码是非法的构造.
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)
只需添加一个具有更明确诊断的示例:
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)
您可以看到对此有明确的规则。我没看过规格。
| 归档时间: |
|
| 查看次数: |
994 次 |
| 最近记录: |