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
,但在編譯之前不可能猜到這個名字,但我們可以使用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
,而是有其獨特的類型,所以即使它可以間接獲得也沒有多大價值。
您可以使用** may **幾次。這只是一個猜測嗎? 這是一種類型的刪除,因爲沒有**已知類型**,我怎麼能繼續使用lambda之外的值?它是否受到處理一個'int'作爲基礎類型自動?對不起,你的回答並不令人滿意。 – cwschmidt
你在使用哪種編譯器? '使用x_type = typename decltype(x);'似乎不適用於GCC。 (「主要。CPP:10:29:錯誤: '之前decltype' 使用x_type預計嵌套名稱 - 符=類型名稱decltype(X);「) – cwschmidt
@cwschmidt它只是'使用x_type = decltype(X);'無需'類型名稱。' –