cws*_*idt 7 lambda scope type-safety enum-class c++14
为什么以及如何运作?什么类型的'自动'在这里?
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!
Run Code Online (Sandbox Code Playgroud)
该enum class Local
不拉姆达类型以外公知的.它是一个enum class
,因此不能没有int
演员阵容,AFAIK.如何返回本地类型auto
以及它在lambda之外的类型是什么?
这与lambdas或enum class
es 无关,这适用于任何具有推导返回类型的函数中的任何本地类型:
auto f() {
struct X {};
return X{};
}
int main() {
auto x = f();
}
Run Code Online (Sandbox Code Playgroud)
类型x
不能直接从外部函数范围引用,但确实在其中X
定义f
.
为什么以及如何运作?
它之所以有效,是因为:
<lambda_30560bd1c97ca682d011cd006c362574>::()::Local
for 的东西x
。enum class
您可以获取 lambda 的类型,然后使用它来声明其中包含的类型的对象:
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;
}
Run Code Online (Sandbox Code Playgroud)
enum class Local
lambda a 类型之外是未知的。
确实如此,但enum class
如果相关的命名空间已解析,则可以访问。所以内部<lambda_30560bd1c97ca682d011cd006c362574>::()::Local
可以解析到Local
lambda 内部,但是在编译之前不可能猜测这个名称,但是我们可以使用decltype
orauto
来获取类型。
它是 a ,因此不能是没有强制转换
enum class
的类型int
正确的。enum class
但它仍然以与 an存在于常规class
or内部的方式相同的方式存在struct
。
如果没有已知类型,我如何在 lambda 之外继续使用该值?
这种类型在 lambda 之外的实用性是有限的。它不是一个int
,而是有自己独特的类型,因此即使可以间接获得它也没有什么价值。
归档时间: |
|
查看次数: |
289 次 |
最近记录: |