为什么以及如何运作? 什么类型的'汽车'这里?
auto lambda = [](){
enum class Local { X=0 };
return Local::X;
};
auto x = lambda(); // No error! Why and what type is auto in this case?
auto y = Local::X; // Error! Of course!
在lambda a type之外不知道enum class Local
。
它是enum class
,因此如果没有演员阵容,则不能是int
类型的AFAIK。
如何将本地类型作为auto
返回,它在lambda之外的类型是什么?
答案 0 :(得分:5)
这与lambdas或enum class
es无关,这适用于任何具有推导返回类型的函数中的任何本地类型:
auto f() {
struct X {};
return X{};
}
int main() {
auto x = f();
}
x
的类型不能直接从外部函数范围引用,但在X
中确实f
定义。
答案 1 :(得分:4)
为什么以及如何运作?
它的工作原因是:
<lambda_30560bd1c97ca682d011cd006c362574>::()::Local
提供类似x
的内容。您可以获取lambda的类型,然后使用它来声明其中包含的enum class
类型的对象:
auto lambda = []() {
enum class Local { X = 0, Z = 1 };
return Local::X;
};
int main() {
auto x = lambda(); // No error! Why and what type is auto in this case?
//auto y = Local::X; // Error! Of course!
using x_type = decltype(x);
x_type y;
y = x_type::Z; // can refer to enum members here
y = x;
}
在lambda a type之外不知道
enum class Local
。
是的,但如果解析了相关的命名空间,则可以访问enum class
。所以内部<lambda_30560bd1c97ca682d011cd006c362574>::()::Local
可以解析为lambda中的Local
,但是在编译之前无法猜出这个名称,但我们可以使用decltype
或auto
来获取类型
这是一个
enum class
,因此如果没有演员,则不能是int
类型
正确。但它的存在方式与常规enum class
或class
内可能存在struct
的方式相同。
没有已知的类型,我该怎么办? 继续使用lambda之外的那个值?
这种类型在lambda之外的效用是有限的。它不是int
,而是有自己独特的类型,因此即使可以间接获得它也没什么价值。