【发布时间】:2021-06-22 13:21:53
【问题描述】:
我经常使用初始化列表和 for-each 循环来遍历少量的 ad-hoc 值,如下所示:
for (auto x : {1, 2, 6, 24, 120}) {
do_something(x);
}
我最近尝试编写类似的东西,但使用结构化绑定和打包在一起的值:
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}}; 这样的东西也不会编译。
这给我留下了两个问题:
-
是否有替代语法以简洁易读的方式完成我想要的?
-
为什么
auto mylist的类型不被解析为initializer_list<initializer_list<int>>?这不是很好吗?
【问题讨论】:
-
平台?编译器?
-
@SeverinPappadeux 我看不出这对这个问题有多重要。这是一个 C++ 语言问题,与平台和编译器无关。
-
@SeverinPappadeux 这些是不同的东西。您指定的类型很好。 OP 询问是否可以仅从
{ {}, ... }推断出,这实际上是不可能的。 -
无关:你可以给它一些指导,它应该可以工作:
{std::pair{-1, 0}, {1, 0}, {0, -1}, {0, 1}} -
@PresleyGraham:“初始化器列表”之所以如此命名,是因为您应该使用它们来初始化一个对象。您并没有真正使用它们来做到这一点,因此您有点滥用该功能。这就是为什么它有奇怪的极端情况,它不能按照你想要的方式工作。