回答
围绕左值/右值条款存在一个常见的误解。他们不是指变量,而是指表达式。一个表达式可以产生一个左值或右值,并且可以是常量或非常量。
特别是,在您的代码中,定义int j = i;
右侧的表达式i
是一个左值表达式,而不是右值。为了赋值,有一个左值右值转换,然后将其赋值给新声明的变量。
连续性是一个正交的概念 - 在大多数情况下 - 与您是否可以或不可以改变正在处理的对象有关。
int f();
int& g();
const int& h();
const int k();
int main() {
f(); // non-const rvalue expression
g(); // non-const lvalue expression
h(); // const lvalue expression
k(); // const rvalue expression
f() = 5; // error, cannot assign to an rvalue
g() = 5; // correct, can modify a non-const lvalue
h() = 5; // error, cannot modify a constant lvalue
}
其他例子需要使用用户定义类型:
struct test {
void foo() { x = 5; }
void bar() const;
int x;
};
test f();
const test g();
int main() {
f().foo(); // f() is a non-const rvalue,
// but you can call a method on the resulting object
g().foo(); // g() is a const rvalue,
// you cannot call a mutating member function
g().bar(); // but you can call a const member function
}
嗨,为什么我不能编译第一个例子?谢谢。我试着评论错误陈述,但仍然没有编译。 – user12321 2011-03-03 00:55:45
@ user12321:你可能可以编译而不是*链接*,因为函数没有被定义(错误是类似* undefined symbol ... *?的错误)。添加一个像'{static int x = 10; return x; }'给每个函数,注释那些被标记为错误的行,然后重试。 ('static'仅用于确保从返回引用的版本返回后该变量仍然存在) – 2011-03-03 08:36:56
在C++中,右值的内置类型不能是const或者非const。这只是没有意义。但是,类类型可以是const和非const类型的。
右值只是VALUE(而不是对象/变量)。你对“非常量值”有什么了解?
@Downvoter:我想知道我的回答中有什么错误? – 2011-03-01 13:17:28
@Armen:我不是@downvoter,但是......你说“在C++中,内建类型的rvalues不能是const或非const。”右值**必须是常量或非常量。在OP示例中,我是右值并且是**非常量**。如果我被声明为'const int i = 5;'那么当用作右值时,右值是** const **。 – qbert220 2011-03-01 13:34:41
@qbert:错误:) C++标准3.10.9状态类的右值可以具有cv限定的类型;非类rvalues总是有cv不合格的类型。 Rvalues应始终具有完整的类型或void类型;除了这些类型之外,左值还可以具有不完整的 类型。 – 2011-03-01 13:42:32
- 1. 非等级rvalues总是有cv-不合格类型
- 2. rvalues的价值是什么?
- 3. Rvalues vs temporaries
- 4. C++中的Rvalues 03
- 5. rvalues有什么名字?
- 6. rvalues C++ 0x and moving to stack
- 7. 从变量而不是ob_get_content总结
- 8. javascript变量总是不相等
- 9. 变量总是复位
- 10. 变量总是返回false
- 11. 变量总是等于零
- 12. 总是整数变量
- 13. 是否有支持Rvalues的ref的指针版本?
- 14. 总是(节点js)不总是工作
- 15. rvalues在C++中存储在哪里?
- 16. 是否总是使用常量变量?
- 17. 总变量不会更新
- 18. TopMost不是TopMost总是 - WPF
- 19. Visual Studio 2015字符串文字不总是不变?
- 20. 试图找出某个变量的总和不是总和使用sql
- 21. JS文本变量总是显示undefined
- 22. SharedPreferences变量总是返回false
- 23. 实例变量总是返回零
- 24. 布尔变量总是返回false
- 25. 区域总是变成0结构
- 26. Laravel .ENV变量总是返回null
- 27. mod_rewrite的变量总是== '的index.php'
- 28. angularjs默认选择总是变化
- 29. try_files总是返回404变量
- 30. Nagios NSCA第四变量总是$ OUTPUT $
“要求'const'”:如果它接受一个'const的A&',你也可以通过它的一些'A&'因为从非const到const的转换隐式发生。 – 2011-03-01 13:14:19
你应该添加“你的拷贝构造函数”的代码,并解释“你需要一个'const'”的含义。这将有助于回答您的实际疑问,而不是回答可能存在误导的问题。 – 2011-03-01 14:16:17