- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的代码如下:
#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/
[N4687] 3.9 [defns.dynamic.type] dynamic type 〈glvalue〉 type of the most derived object (4.5) to whi
我的代码如下: #include #include int main(){ for(int& v : std::vector{1,3,5,10}) { std::cout
我最近一直在仔细研究 C++ 类别。 lvalue 和 rvalue 之间的区别似乎很清楚,但是当谈到 prvalue 和 xvalue 时,我感到困惑。 给出下面的例子: #include usi
根据 this博客——我意识到这是旧的,如果它不再被认为是相关的,请告诉我——实现二元运算符的最佳方法如下... // The "usual implementation" Matrix operat
在 C++11 5.1 Primary Expressions 中声明: The type of [an id-expression] is the type of the identifier. T
对于这个问题的广泛性,我很抱歉,只是所有这些细节都是紧密相关的.. 我一直在努力理解具体两个值类别(xvalues 和 prvalues)之间的区别,但我仍然感到困惑。 无论如何,我试图为自己建立的关
有没有办法定义一个只处理 xvalue 或 prvalue 的函数(或者这里是异或)? 例如,假设我有一个方法 f(foo&& f),我如何声明 f 绑定(bind) xvalue 类型并拒绝 prv
几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解: 定义变量或函数参数的类型(即 int x; 与 int && x = …; 表达式的表达式类别,包
这个问题是在我研究 decltype 行为及其派生表达式类型的规则时提出的。如果表达式是纯右值,是否有任何理由不提升通用 cv 限定符?类型。例如:- 在下面的代码中,表达式 i+j 是由declty
C++标准定义删除了以下函数; template void ref(const T&&) = delete; template void cref(const T&&) = delete; 这是为
What are rvalues, lvalues, xvalues, glvalues, and prvalues?很好地概述了右值/左值的分类,最近对该问题的回答之一 (https://stack
在 C++03 中,表达式可以是 rvalue 或 lvalue。 在 C++11 中,表达式可以是: 右值 左值 xvalue glvalue prvalue 两个类别变成了五个类别。 这些新的表达
decltype(1+2) 是否声明了一个 xvalue 或 prvalue? cppreference 说,decltype(expression) 将声明:1. T&& if expression
我是一名优秀的程序员,十分优秀!