7

为什么以及如何工作?这里的“自动”是什么类型?

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 Locallambda 类型之外是未知的。它是一个enum class,因此不能是int没有演员表的类型,AFAIK。如何返回本地类型,auto以及它在 lambda 之外的真正类型是什么?

4

2 回答 2

5

这与 lambdas 或 es 无关enum class,这适用于任何具有推导返回类型的函数中的任何本地类型:

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

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

类型 ofx不能直接从函数范围外引用,但它确实X定义在f.

于 2017-02-02T20:36:46.800 回答
4

为什么以及如何工作?

它之所以有效,是因为:

  • lambda 表达式导致在编译时生成和命名 一个唯一的类。
    • 此类的类型由编译器在内部命名。
    • 因此编译器可能会想出类似<lambda_30560bd1c97ca682d011cd006c362574>::()::Localfor的东西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;
}

enum class Locallambda 类型之外是未知的。

是的,但enum class如果相关命名空间已解析,则可以访问。所以内部<lambda_30560bd1c97ca682d011cd006c362574>::()::Local可以解析到Locallambda 内部,但是在编译之前不可能猜到这个名字,但是我们可以使用decltypeorauto来获取类型。

它是一个enum class,因此不能是int没有演员表的类型

正确的。enum class但它仍然以与 an可以存在于常规classor中相同的方式存在struct

如果没有已知类型,我如何在 lambda 之外继续使用该值?

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

于 2017-02-02T20:30:35.590 回答