jjzjj

c++ - 什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?

在C++03中,表达式可以是rvalue或lvalue。在C++11中,表达式可以是:右值左值xvalueglvalueprvalue两个类别变成了五个类别。这些新的表达方式是什么?这些新类别与现有的右值和左值类别有何关联?C++0x中的右值和左值类别是否与C++03中的相同?为什么需要这些新类别?是WG21神只是想迷惑我们这些凡人? 最佳答案 我想这个文档可能会作为一个不那么简短的介绍:n3055整个屠杀从移动语义开始。一旦我们有了可以移动而不是复制的表达式,突然容易掌握的规则要求区分可以移动的表达式以及移动的方向。根据我的草稿猜

c++ - 优化编译器可以添加 std::move 吗?

编译器能做吗自动左值到右值转换如果它可以证明左值不会再次使用?这里有一个例子来阐明我的意思:voidFoo(vectorvalues){...}voidBar(){vectormy_values{1,2,3};Foo(my_values);//maythecompilerpretendIusedstd::movehere?}如果std::move被添加到注释行,那么vector可以move到Foo的参数,而不是复制。但是,正如所写,我没有使用std::move.静态证明在注释行之后不会使用my_values非常容易。那么编译器允许movevector,还是需要复制它?

c++ - 优化编译器可以添加 std::move 吗?

编译器能做吗自动左值到右值转换如果它可以证明左值不会再次使用?这里有一个例子来阐明我的意思:voidFoo(vectorvalues){...}voidBar(){vectormy_values{1,2,3};Foo(my_values);//maythecompilerpretendIusedstd::movehere?}如果std::move被添加到注释行,那么vector可以move到Foo的参数,而不是复制。但是,正如所写,我没有使用std::move.静态证明在注释行之后不会使用my_values非常容易。那么编译器允许movevector,还是需要复制它?

c++ - 右值结构的成员是右值还是左值?

返回结构的函数调用是一个右值表达式,但它的成员呢?这段代码在我的g++编译器中运行良好,但gcc给出错误提示“需要左值作为赋值的左操作数”:structA{intv;};structAfun(){structAtmp;returntmp;}intmain(){fun().v=1;}gcc将fun().v视为右值,我可以理解。但是g++并不认为赋值表达式是错误的。这是否意味着fun1().v在C++中是左值?现在的问题是,我搜索了C++98/03标准,没有发现fun().v是左值还是右值。那么,它是什么? 最佳答案 右值表达式的成员是

c++ - 右值结构的成员是右值还是左值?

返回结构的函数调用是一个右值表达式,但它的成员呢?这段代码在我的g++编译器中运行良好,但gcc给出错误提示“需要左值作为赋值的左操作数”:structA{intv;};structAfun(){structAtmp;returntmp;}intmain(){fun().v=1;}gcc将fun().v视为右值,我可以理解。但是g++并不认为赋值表达式是错误的。这是否意味着fun1().v在C++中是左值?现在的问题是,我搜索了C++98/03标准,没有发现fun().v是左值还是右值。那么,它是什么? 最佳答案 右值表达式的成员是

c++ - 构造函数的最佳形式?传值还是传引用?

我想知道我的构造函数的最佳形式。下面是一些示例代码:classY{...}classX{public:X(constY&y):m_y(y){}//(a)X(Yy):m_y(y){}//(b)X(Y&&y):m_y(std::forward(y)){}//(c)Ym_y;}Yf(){return...}intmain(){Yy=f();Xx1(y);//(1)Xx2(f());//(2)}据我所知,这是编译器在每种情况下都能做到的最好的。(1a)y被复制到x1.m_y(1copy)(1b)y被拷贝到X的构造函数的参数中,然后拷贝到x1.m_y中(2份)(1c)y移入x1.m_y(1mov

c++ - 构造函数的最佳形式?传值还是传引用?

我想知道我的构造函数的最佳形式。下面是一些示例代码:classY{...}classX{public:X(constY&y):m_y(y){}//(a)X(Yy):m_y(y){}//(b)X(Y&&y):m_y(std::forward(y)){}//(c)Ym_y;}Yf(){return...}intmain(){Yy=f();Xx1(y);//(1)Xx2(f());//(2)}据我所知,这是编译器在每种情况下都能做到的最好的。(1a)y被复制到x1.m_y(1copy)(1b)y被拷贝到X的构造函数的参数中,然后拷贝到x1.m_y中(2份)(1c)y移入x1.m_y(1mov

C++0x const RValue 引用作为函数参数

我试图理解为什么有人会编写一个采用constrvalue引用的函数。在下面的代码示例中,constrvalue引用函数的用途是什么(返回“3”)。以及为什么重载解析优先于constLValue引用函数(返回“2”)之上的constRvalue。#include#include#includestd::vectorcreateVector(){returnstd::vector();}//takesmovablervaluevoidfunc(std::vector&&p){std::cout&p){std::cout&&p){std::cout 最佳答案

C++0x const RValue 引用作为函数参数

我试图理解为什么有人会编写一个采用constrvalue引用的函数。在下面的代码示例中,constrvalue引用函数的用途是什么(返回“3”)。以及为什么重载解析优先于constLValue引用函数(返回“2”)之上的constRvalue。#include#include#includestd::vectorcreateVector(){returnstd::vector();}//takesmovablervaluevoidfunc(std::vector&&p){std::cout&p){std::cout&&p){std::cout 最佳答案

c++ - 是否有原因 declval 返回 add_rvalue_reference 而不是 add_lvalue_reference

将类型更改为类型的reference,允许访问该类型的成员而无需创建该类型的实例。lvaluereferences和rvaluereferences似乎都是如此。declval是用add_rvalue_reference而不是add_lvalue_reference实现的,这只是一个约定吗,或者有没有使用add_rvalue_reference更可取的例子?编辑:我想我有点含糊,这些答案都很好,但触及的点略有不同。建议使用两种不同的答案,Howard强调您可以选择您的类型所具有的引用,从而使add_rvalue_reference更加灵活。其他答案强调默认行为会自动选择更自然地反射(r