gpt4 book ai didi

c++ - 嵌套的基于范围的 for 语句是否严格合法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:26:32 25 4
gpt4 key购买 nike

考虑这段代码:

#include <vector>
#include <iostream>

int main()
{
std::vector<int> v1 {1,2};
std::vector<int> v2 {4,5};
for (auto i : v1) {
for (auto j : v2) {
std::cout << i << ',' << j << '\n';
}
}
}

正如预期的那样,GCC 4.8 compiles it just fine ,输出为:

1,4
1,5
2,4
2,5

但是,C++11 是这样定义 ranged-for 的:

{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}

确实说:

__range, __begin, and __end are variables defined for exposition only

但它没有阐明每个 ranged-for 语句应该扩展到其中每个变量都是唯一的代码,因此不会在封闭的 ranged-for 中隐藏相同的变量。

为此,在我看来,嵌套的 ranged-for 语句不能保证按预期工作。

我们确定这不是缺陷吗?

最佳答案

是的,这是完全合法的。

ranged-for 的整个定义,尽管在标准中几乎是独一无二的,它是根据代码给出的,但它并不是一个简单的扩展:这个结构被设计为使用所有操作的中间表示在编译器内部扩展需要。

简而言之,术语“说明”的使用意味着无论如何这都是有效的伪代码。

此外,如果您仔细查看这些变量的作用域,它们不可能与在封闭的范围 for 语句中声明的相同变量的指定用法冲突,我们自己的 statement 无论如何都无法访问它们。也就是说,在任何情况下,隐藏这些循环变量都不会导致意外行为。

关于c++ - 嵌套的基于范围的 for 语句是否严格合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411353/

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