gpt4 book ai didi

c++ - 为什么在这里创建对 prvalue 的左值引用是合法的?

转载 作者:IT老高 更新时间:2023-10-28 22:33:22 26 4
gpt4 key购买 nike

我的代码如下:

#include <vector>
#include <iostream>


int main(){
for(int& v : std::vector<int>{1,3,5,10}) {
std::cout << v << std::endl;
v++; // Does this cause undefined behavior?
}
return 0;
}

据我了解,vector是prvalue,不能绑定(bind)到int&,但是这个能正常工作吗?

是不是因为for范围循环只是宏扩展,会为 vector 创建一个临时变量?

最佳答案

根据 C++ ISO 规范,基于范围的 for 循环被正式定义为等价于

{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}

请注意,“等价于”并不意味着“扩展为宏”,而是“具有完全相同的行为”。这种等价不是传统意义上的宏(即它不是 #define),而是在 ISO 规范中作为定义基于范围的语义的正式方式给出循环可以。基于范围的 for 循环的实现可以是编译器喜欢的任何方式,只要行为与上面给出的行为完全相同。

在这种情况下,range_expression 是一个纯右值,但它随后被绑定(bind)到 __range,这是一个左值。扫描 __range 获得的迭代器也是左值,因此当取消引用迭代器以产生范围内的各个值时,这些值将是左值。

希望这会有所帮助!

关于c++ - 为什么在这里创建对 prvalue 的左值引用是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21465416/

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