gpt4 book ai didi

c++ - 我可以使用结构化绑定(bind)和 for-each 循环来迭代几个 “packed-together” 值吗?

转载 作者:行者123 更新时间:2023-12-04 01:04:59 24 4
gpt4 key购买 nike

我经常使用初始化列表和 for-each 循环来迭代少量的临时值,如下所示:

for (auto x : {1, 2, 6, 24, 120}) {
do_something(x);
}

我最近尝试写一些类似的东西,但是用结构化绑定(bind)和打包在一起的值代替:

for (auto[dx, dy] : {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}) {
try_to_move(dx, dy); // nope! won’t compile
}

不幸的是,这无法编译。 Clang 告诉我:

error: cannot use type ‘void’ as a range

事实上,甚至像 auto mylist = {{1, 2}, {3, 4}}; 这样的东西不会编译。

这留给我两个问题:

  1. 是否有替代语法以简洁易读的方式完成我想要的内容?

  2. 为什么 auto mylist 的类型不是被解析为 initializer_list<initializer_list<int>> ?这样不好吗?

最佳答案

Why doesn’t the type of auto mylist get parsed as initializer_list<initializer_list<int>>? Wouldn’t that work fine?

原因是还没有人提出。

方便的语法 auto x = {1, 2, 6, 24, 120};来自提案N3912它被 C++17 采用(另见 N3922 )。

扣减过程在[dcl.type.auto.deduct]/4中有概述。 :

If the placeholder is the auto type-specifier, the deduced type T' replacing T is determined using the rules for template argument deduction. Obtain P from T by replacing the occurrences of auto with either a new invented type template parameter U or, if the initialization is copy-list-initialization, with std​::​initializer_­list<U>. Deduce a value for U using the rules of template argument deduction from a function call, where P is a function template parameter type and the corresponding argument is e. If the deduction fails, the declaration is ill-formed.

由于假设函数调用中的类型推导 f({1, 2})会失败,嵌套的 braced-init-list 推导也是如此 auto x = { {1, 2}, {3, 4} };也是不可能的。

我想同样的技巧可以应用于函数调用的推导,这将使嵌套 initializer_list可以扣除。

欢迎提出后续建议。

Is there an alternative syntax to accomplish what I want in a terse and readable manner?

你可以定义一个很好的旧多维数组:

int lst[][2] = { {1, 2}, {3, 4}, {5, 6}, {7, 8} };
for (auto [x, y] : lst) {
. . .
}

或者按照评论中的建议,给第一对一个类型来帮助推导:

for (auto [x, y] : { std::pair{1, 2}, {3, 4}, {5, 6}, {7, 8} }) {
. . .
}

关于c++ - 我可以使用结构化绑定(bind)和 for-each 循环来迭代几个 “packed-together” 值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66804648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com