为什么 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,但是在编译之前不可能猜到这个名字,但是我们可以使用 decltypeauto 来获取类型.

It's a enum class and therefore cannot be of type int without a cast

正确。但它仍然以与 enum class 可以存在于常规 classstruct.

中相同的方式存在

Without a known type, how can I continue work with that value outside the lambda?

这种类型在 lambda 之外的效用是有限的。它不是int,而是有其独特的类型,因此即使可以间接获得它也没有什么价值。

这与 lambdas 或 enum classes 无关,这适用于推导出 return 类型的任何函数中的任何局部类型:

auto f() {
    struct X {};
    return X{};
}

int main() {
    auto x = f();
}

x 的类型不能从函数范围外直接引用,但它确实是 Xf.

中定义的