小编Law*_*nce的帖子

c ++ lambda按值捕获

我正在阅读本书第3章中的C++ lambda部分,以下代码让我困惑:

int x = 0;
int y = 42;
auto qqq = [x, &y] {
    std::cout << "x: " << x << std::endl;
    std::cout << "y: " << y << std::endl;
    ++y;
};
x = y = 77;
qqq();
qqq();
std::cout << "final y: " << y << std::endl;
Run Code Online (Sandbox Code Playgroud)

这段代码打印出来:

x: 0
y: 77
x: 0
y: 78
final y: 79
Run Code Online (Sandbox Code Playgroud)

为什么qqq()没有注册x已经改为77?据说,通过值传递意味着我们可以读取但不能修改定义lambda的数据.这是否意味着我们在定义后无法看到变化?

c++ c++11

18
推荐指数
3
解决办法
7983
查看次数

从任意未知 Nats 中提取值

给定类型级列表函数(来自这篇博文

type family Length (xs :: [*]) :: Nat where
    Length '[] = 0
    Length (_ ': xs) = 1 + Length xs
Run Code Online (Sandbox Code Playgroud)

“硬编码”类型列表长度的值提取按预期工作

t1 :: Integer
t1 = natVal (Proxy :: Proxy (Length '[Int]))
Run Code Online (Sandbox Code Playgroud)

并且t1 = 1。但是,创建一个从任意列表中获取值的函数似乎失败了。

t2 :: forall (xs :: [*]). Proxy xs -> Integer
t2 _ = natVal (Proxy :: Proxy (Length xs))
Run Code Online (Sandbox Code Playgroud)

给出错误

    • No instance for (KnownNat (Length xs))
        arising from a use of ‘natVal’
Run Code Online (Sandbox Code Playgroud)

这似乎很不幸但合理,因为只有文字是“已知的”。但是,强制满足如下约束会导致对模棱两可的类型的抱怨。

unsafeKnownConstr :: c :~: …
Run Code Online (Sandbox Code Playgroud)

haskell types type-constraints type-families type-level-computation

5
推荐指数
0
解决办法
80
查看次数