为什么lambda表达式可以返回本地枚举类类型?

时间:2017-02-02 20:28:12

标签: lambda scope c++14 type-safety enum-class

为什么以及如何运作? 什么类型的'汽车'这里?

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之外的类型是什么?

2 个答案:

答案 0 :(得分:5)

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

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

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

x的类型不能直接从外部函数范围引用,但在X中确实f定义。

答案 1 :(得分:4)

  

为什么以及如何运作?

它的工作原因是:

  • lambda表达式导致在编译时生成并命名唯一类
    • 此类的类型由内部编译器命名。
    • 因此,编译器可能会为<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,但是在编译之前无法猜出这个名称,但我们可以使用decltypeauto来获取类型

  

这是一个enum class,因此如果没有演员,则不能是int类型

正确。但它的存在方式与常规enum classclass内可能存在struct的方式相同。

  

没有已知的类型,我该怎么办?   继续使用lambda之外的那个值?

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

相关问题