这个问题询问所有临时值是否都是右值.
答案是否定的,因为如果我们考虑这个表达式:
const int &ri = 2 + 3;
Run Code Online (Sandbox Code Playgroud)
那么,同样的临时(2 + 3)值(这里是一个右值)可以用作后续表达式中的左值:
const int *pi = &ri;
Run Code Online (Sandbox Code Playgroud)
所以这个临时不是(仅)一个右值.
然后逻辑语句temporary ==> rvalue是错误的.
但是,我们不能写
const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue
Run Code Online (Sandbox Code Playgroud)
要么
int *i = &4; // illegal, 4 is an rvalue (literal)
Run Code Online (Sandbox Code Playgroud)
要么
int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue
Run Code Online (Sandbox Code Playgroud)
因此我的问题是,我们可以在某个表达式中生成一个rvalue而不需要临时或文字吗?是rvalue ==> (temporary or literal)真的吗?