C++ 要获得右值,需要临时值还是文字值?

C++ 要获得右值,需要临时值还是文字值?,c++,temporary,rvalue,C++,Temporary,Rvalue,询问是否所有临时值都为右值 答案是否定的,因为如果我们考虑这个表达式: const int &ri = 2 + 3; const int *pi = &ri; 然后,可以使用相同的临时(2+3),它在这里是一个右值 作为后续表达式中的左值: const int &ri = 2 + 3; const int *pi = &ri; 所以这个临时值不是(唯一的)右值 逻辑语句temporary==>rvalue则为false 然而,我们不能写作 const in

询问是否所有临时值都为右值

答案是否定的,因为如果我们考虑这个表达式:

const int &ri = 2 + 3;
const int *pi = &ri;
然后,可以使用相同的临时
(2+3)
,它在这里是一个右值 作为后续表达式中的左值:

const int &ri = 2 + 3;
const int *pi = &ri;
所以这个临时值不是(唯一的)右值

逻辑语句
temporary==>rvalue
则为false

然而,我们不能写作

const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue

因此,我的问题是,我们能在一个特定的表达式中生成一个右值而没有
有临时的还是文字的?
rvalue==>(临时或文字)
true吗?

生成临时对象的表达式r值。有一个特殊的规则允许常量引用和r值引用绑定到r值,这将临时对象的生存期延长到引用的生存期(参见12.2(5)),但这不会使临时对象表达式的r值变小

但是,一旦绑定到引用,引用变量本身就有一个名称,因此引用表达式是l-左值


不要混淆表达式、变量和对象。

生成临时对象的表达式是r值。有一个特殊的规则允许常量引用和r值引用绑定到r值,这将临时对象的生存期延长到引用的生存期(参见12.2(5)),但这不会使临时对象表达式的r值变小

但是,一旦绑定到引用,引用变量本身就有一个名称,因此引用表达式是l-左值

不要混淆表达式、变量和对象。

右值和左值属性适用于表达式,而不是对象。表达式可以是左值或右值。将产生值的表达式过度简化为右值表达式,而产生对象的表达式为左值表达式。从左值到右值的转换是从对象中读取值的行为

生成临时和文本的表达式都是右值表达式,它们表示的是值而不是实际对象

在您的示例中:

const int &ri = 2 + 3;
const int *pi = &ri;
表达式
2+3
是用于初始化常量引用的右值表达式。根据该语言,这意味着将临时表达式的生存期延长到当前表达式之外,直到引用超出范围。之后,在第二个表达式中,子表达式
ri
是一个左值表达式,它引用的临时对象的生存期已经延长

请注意,还有其他使用临时变量创建右值表达式的方法,例如调用生成引用的成员:

struct test {
   test& thisTest() { return *this; }
};
test foo();
... foo().thisTest()
子表达式
foo()
是右值表达式,但表达式
foo()。thisTest()
是左值表达式。它们都是指一个临时对象,该对象将在完整表达式结束时消失。

右值和左值属性适用于表达式,而不是对象。表达式可以是左值或右值。将产生值的表达式过度简化为右值表达式,而产生对象的表达式为左值表达式。从左值到右值的转换是从对象中读取值的行为

生成临时和文本的表达式都是右值表达式,它们表示的是值而不是实际对象

在您的示例中:

const int &ri = 2 + 3;
const int *pi = &ri;
表达式
2+3
是用于初始化常量引用的右值表达式。根据该语言,这意味着将临时表达式的生存期延长到当前表达式之外,直到引用超出范围。之后,在第二个表达式中,子表达式
ri
是一个左值表达式,它引用的临时对象的生存期已经延长

请注意,还有其他使用临时变量创建右值表达式的方法,例如调用生成引用的成员:

struct test {
   test& thisTest() { return *this; }
};
test foo();
... foo().thisTest()

子表达式
foo()
是右值表达式,但表达式
foo()。thisTest()
是左值表达式。它们都指向一个临时对象,该对象将在完整表达式结束时消失。

不要混淆表达式、变量和对象:正确。l值和r值适用于表达式。临时值不是r值,产生临时值的表达式是r值expression@DavidRodríguez dribeas:是的,的确——说得很好。12.2(5)所说的,证实了
temporary==>rvalue
是错误的,这是正确的。但我仍然没有一个例子表明
rvalue==>(临时或文字)
是错误的。正如我对David所说的,我不是在挑战,只是在试图理解这个断言(
rvalue==>(临时的或文字的)
)是否可以实现。谢谢。@VincenzoPii:很多东西都是右值。例如,衰减的C数组名。或
。或者某个静态强制转换的结果。@Vincenzopi:除了这些示例之外,在需要右值的上下文中使用的左值表达式将通过(显然命名为):左值到右值的转换转换为右值<代码>整数a=5;int b=1+a <代码> < <代码>是一个将被转换为rValk的LValk,因此在这个特定用法<>代码> < /COD>是一个RValk,正如我前面提到的:考虑一个LValk是对一个真实对象的引用,而一个R值仅仅是一个值(可能存储在一个对象中),不要混淆表达式,变量和对象:正确。l值和r值适用于表达式。临时值不是r值,产生临时值的表达式是r值expression@DavidRodríguez dribeas:是的,的确——说得很好。12.2(5)所说的,证实了
temporary==>rvalue
是错误的,这是正确的。但我还是不知道