为什么 lambda 表达式 return 可以是本地枚举 class 类型?
Why can a lambda expression return a local enum class type?
为什么以及如何工作?
这里的 'auto' 是什么类型?
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!
enum class Local
在 lambda 之外是未知的类型。
它是一个 enum class
并且因此不能是 int
没有转换的类型,AFAIK。
本地类型如何返回为 auto
以及它在 lambda 之外的真正类型是什么?
Why and how does this work?
之所以有效,是因为:
- lambda 表达式导致在编译时生成并命名一个 唯一的 class。
- 这个class的类型由编译器内部命名。
- 因此编译器可能会为
x
. 想出类似 <lambda_30560bd1c97ca682d011cd006c362574>::()::Local
的东西
您可以获得 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;
}
The enum class Local
is not known outside the lambda a type.
正确,但如果相关命名空间已解析,则 enum class
可访问。所以内部 <lambda_30560bd1c97ca682d011cd006c362574>::()::Local
可以在 lambda 内部解析为 Local
,但是在编译之前不可能猜到这个名字,但是我们可以使用 decltype
或 auto
来获取类型.
It's a enum class
and therefore cannot be of type int
without a cast
正确。但它仍然以与 enum class
可以存在于常规 class
或 struct
.
中相同的方式存在
Without a known type, how can I
continue work with that value outside the lambda?
这种类型在 lambda 之外的效用是有限的。它不是int
,而是有其独特的类型,因此即使可以间接获得它也没有什么价值。
这与 lambdas 或 enum class
es 无关,这适用于推导出 return 类型的任何函数中的任何局部类型:
auto f() {
struct X {};
return X{};
}
int main() {
auto x = f();
}
x
的类型不能从函数范围外直接引用,但它确实是 X
在 f
.
中定义的
为什么以及如何工作? 这里的 'auto' 是什么类型?
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!
enum class Local
在 lambda 之外是未知的类型。
它是一个 enum class
并且因此不能是 int
没有转换的类型,AFAIK。
本地类型如何返回为 auto
以及它在 lambda 之外的真正类型是什么?
Why and how does this work?
之所以有效,是因为:
- lambda 表达式导致在编译时生成并命名一个 唯一的 class。
- 这个class的类型由编译器内部命名。
- 因此编译器可能会为
x
. 想出类似
<lambda_30560bd1c97ca682d011cd006c362574>::()::Local
的东西
您可以获得 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;
}
The
enum class Local
is not known outside the lambda a type.
正确,但如果相关命名空间已解析,则 enum class
可访问。所以内部 <lambda_30560bd1c97ca682d011cd006c362574>::()::Local
可以在 lambda 内部解析为 Local
,但是在编译之前不可能猜到这个名字,但是我们可以使用 decltype
或 auto
来获取类型.
It's a
enum class
and therefore cannot be of typeint
without a cast
正确。但它仍然以与 enum class
可以存在于常规 class
或 struct
.
Without a known type, how can I continue work with that value outside the lambda?
这种类型在 lambda 之外的效用是有限的。它不是int
,而是有其独特的类型,因此即使可以间接获得它也没有什么价值。
这与 lambdas 或 enum class
es 无关,这适用于推导出 return 类型的任何函数中的任何局部类型:
auto f() {
struct X {};
return X{};
}
int main() {
auto x = f();
}
x
的类型不能从函数范围外直接引用,但它确实是 X
在 f
.