2017-02-02 76 views
7

爲什麼以及它如何工作? 這裏是什麼類型的'自動'?爲什麼lambda表達式返回本地枚舉類類型?

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 a類型之外是未知的。 這是一個enum class因此不能是int沒有演員,AFAIK。 如何將本地類型返回爲auto以及它在lambda之外的類型是什麼?

回答

4

Why and how does this work?

它的工作原理是因爲:

  • lambda表達式導致生成一個獨特的在編譯時命名。
    • 該類的類型由編譯器內部命名。
    • 因此編譯器可能會爲x想出類似<lambda_30560bd1c97ca682d011cd006c362574>::()::Local的東西。

你可以得到拉姆達的類型,然後使用該聲明包含在它的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,而是有其獨特的類型,所以即使它可以間接獲得也沒有多大價值。

+1

您可以使用** may **幾次。這只是一個猜測嗎? 這是一種類型的刪除,因爲沒有**已知類型**,我怎麼能繼續使用lambda之外的值?它是否受到處理一個'int'作爲基礎類型自動?對不起,你的回答並不令人滿意。 – cwschmidt

+0

你在使用哪種編譯器? '使用x_type = typename decltype(x);'似乎不適用於GCC。 (「主要。CPP:10:29:錯誤: '之前decltype' 使用x_type預計嵌套名稱 - 符=類型名稱decltype(X);「) – cwschmidt

+1

@cwschmidt它只是'使用x_type = decltype(X);'無需'類型名稱。' –

5

這有什麼好做的lambda表達式或enum class ES,這適用於任何地方類型與推導的返回類型的任何功能:

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

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

x類型不能直接從外部功能範圍引用,但確實在f內定義了X

相關問題