我在linux上使用了netng的clang3.3。全部用C ++ 11。我有一个关于初始化的问题
int main()
{
int i();
}
以下代码已编译但无法正常运行。此值不会由调试器定义,也不能打印。我想用默认值描述int。相反,我可以写“int {}”,这将是一个完美的默认初始化。但是我想要理解我在这里写的东西,只是想要。
第二个问题。它关于lambda。我想知道如何在没有auto关键字的情况下描述lamda。
auto lambda = [&]()mutable->int{};
简单,我可以写在这里而不是auto和编译器不会给我一个错误?我只是想了解。
答案 0 :(得分:5)
你被most vexing parse咬了一口。基本上,在某些情况下,C ++语法会导致语句和声明之间的歧义。在这种情况下,输入被解释为声明。由于int i()
可以解释为整数变量定义或函数声明,因此它被解释为无参数函数i
的声明,返回int
。
至于第二个问题,C ++ 11标准版§5.1.2/3
说明了一切:
lambda-expression (...)的类型是一个唯一的,未命名的非联合类类型 - 称为闭包类型(...)< / p>
因此,除了使用auto
之外,没有办法引用它。
答案 1 :(得分:2)
这不是变量默认初始化,它是一个函数声明,感谢most-vexing-parse。
简而言之,标准说如果表达式可以作为函数声明或其他东西进行评估,它将被评估为函数声明。
在您的情况下,函数a
没有参数,int
作为返回值。