v******y 发帖数: 84 | 1 这是我的理解,不对的请指出,谢谢
The usage of rvalue reference &&
Define a class
class MyClass{
public:
MyClass(){/*require for const MyClass cMyClass init. Without this default
constructor, const MyClass will have to be declared and defined as such:
const MyClass cMyClass=MyClass(). MyClass() here will call synthesized
constructor automatically generated by compiler. This synthesized
constructor can not directly initiate const. So following is illegal without
default constructor: const MyClass cMyClass;*/}
};... 阅读全帖 |
|
d******3 发帖数: 70 | 2 http://www.youtube.com/watch?v=UTUdhjzws5g&list=PLE28375D4AC946
This video explains in detail what rvalues and lvalues are. Rvalue and
lvalue are important concepts in C++, and any serious C++ programmer should
have a good understanding of them. C++ 11 introduced a new feature called
rvalue reference, which has made it more important to learn rvalue and
lvalue. |
|
|
N******K 发帖数: 10202 | 4 我说的临时变量 是一个函数返回一个object 这个东西是临时变量 也叫做 rvalue
fun_return_object() 返回一个 object
Foo(X& x) 不能这么用;Foo(fun_return_object())
Foo(X&& x) 可以这么用;Foo(fun_return_object()) |
|
L*D 发帖数: 49 | 5 lz没搞懂什么是rvalue。书上那段话是没错,rvalue的.运算结果还是rvalue。
但是你给的例子*p就不可能是rvalue,所以(*p).也不可能是rvalue。
下面这种例子才.运算符返回rvalue:
struct a {
int x;
};
int main()
{
int x = ((a){1}).x; //((a){1}) is rvalue, so ((a){1}).x is also rvalue
// ((a){1}).x = 2; // this is wrong, cannot assign to rvalue
} |
|
f****4 发帖数: 1359 | 6 c++ primer 5, p150
原文"ptr->mem is a synonym for (*ptr).mem"
所以你说的“(*p).和p->居然是不一样的”是不成立的。
你引用的那段话说的是arrow operator和dot operator的区别
我的理解是因为->必须要指针,所以结果必然是lvalue
.的那部分,我找了一下
http://bytes.com/topic/c/answers/498004-r-r-value-vs-l-value
there are three different contexts where an expression can
appear.
1) A context expecting an rvalue.
2) A context expecting an lvalue.
3) A context accepting both an rvalue or an lvalue (in that case,
semantics are slightly different depending on the type of the
expr... 阅读全帖 |
|
m*********a 发帖数: 3299 | 7 你这个然我想到了一个dot operator不和指针用的时候比如引用
static member的时候,就是rvalue,
->必须和指针用所以是lvalue。
和指针用的时候,肯定是lvalue. 就如楼上说的,我想不到
指针还能返回rvalue的
rvalue是 lvalue的一个subset,
接受rvalue的地方,也接受lvalue
a=1;//1 rvalue
a=b;//b lvalue |
|
m*********a 发帖数: 3299 | 8 还有这个知道了。 code::block 还没有fix这个bug
这是为啥我都晕了,在code::block都是可以assignable lvalue的
但是标准应该是一个是lvalue一个是rvalue
MyClass & f()//return lvalue
MyClass f()//return rvalue
Assignment to rvalues
Visual Studio 2012 didn’t forbid assignment to rvalues as required by the
standard:
struct Dummy
{
int _x;
};
Dummy get_dummy()
{
Dummy d = { 10 };
return d;
}
get_dummy()._x = 20; |
|
N*****7 发帖数: 1899 | 9 Garage door + opener 换新的。 Opener 就选liftmaster.
车库门要装一小排窗户透光。
三个选择。 价格是一扇门(9x8)的价格 包括安装和一年warranty:
Clopay 9130, Rvalue 13, 1000
CHI 2216, Rvalue 17, 1250
Garaga standard+ Rvalue 17,1300
Garaga的 窗户是另加钱300的。 handyman 说insulation比较好。
做个garage door的觉得那个选择比较好? |
|
G***l 发帖数: 355 | 10 你那个Receive里面应该用std::forward而不是std::move。std::move把任何value都
cast成rvalue,比如你有
string a = ...;
holder.Receive(a);
cout << a << endl;
在后面再用a的时候就会出错,因为a的内容已经被你悄悄的move到m_baton里了,但是
你在外面还能继续用a。别人,或者未来的你自己,看代码不会知道你在receive里面做
了什么,后面继续用a的话运行时就会挂掉。
std::forward会把lvalue保持lvalue,rvalue保持rvalue。上面那段code如果Receive
里面是std::forward的话m_baton会被用a来copy construct。后面接着用a不会出错。
如果你是调用holder.Receive(some_func_return_string());的话,m_baton会使用
move constructor来构造。 |
|
f****4 发帖数: 1359 | 11 我终于明白问题在哪了:你根本就没明白啥是rvalue
const static int你想想语言允许你修改么?
我例子里面的f().x是lvalue的话,为啥不能赋值?我可没有const在里面
人家给你的例子是((a){1}).x 是rvalue,你反驳说它是lvalue,因为a{1}.x=100是可
以的,搞笑?
原文说的是dot operator,你却把它当作(*p).
新标里面搞这个rvalue,lvalue是为了move,搞不清楚就不要轻易用 |
|
v******y 发帖数: 84 | 12 这个不能怪楼主,本来c++的lvalue和rvalue的定义和当初老版本的实现冲突
是c++ 的一个bug,新的c++为了和老版本c++兼容,将错就错了
本来lvalue 的定义是identity,
rvalue is a value, can not be assigned, initiated
但是老版本把anomalous rvalue做成可以赋值了
现在就有这个问题
就是当初的时候没有搞好
现在导致很多错误的理解,和c++很多个例 |
|
r*******e 发帖数: 7583 | 13 &a is a rvalue. I don't think u can apply & operator to a rvalue
so &&a won't compile I guess |
|
d****i 发帖数: 4809 | 14 rodney说得是对的,get()返回的是rvalue,不能作为lvalue来赋值。而a[i]就不一样
了,既可以作rvalue,又可以做lvalue,你看一下C++的
const T& get() const;
和
T& get() const;
就知道不同之处了,Java的底层就是C++写的, 所以是同一个道理。 |
|
t****t 发帖数: 6806 | 15 有人自宫,再问一遍
also, you didn't answer me, WHY you claim MSVC reports error when you call
with an rvalue. what kind of rvalue did you used to call foo(int) and foo(
int&)? can you tell me? |
|
r*****3 发帖数: 143 | 16 中文名: 新C++标准:C++0x 概述
原名: Overview of the New C++ : C++0x
作者: Scott Meyers
图书分类: 软件
资源格式: PDF
版本: 英文文字版
出版社: Artima
书号: 978-0-596-80197-6
发行时间: 2011年
地区: 美国
语言: 英文
简介:
内容介绍:
Specification of the next version of C++ (“C++0x”) is nearing completion,
and many compilers (e.g., Visual C++ and Gnu C++) already offer several
features from the revised language. And such features! auto-declared
variables reduce typing drudgery and syntactic noise; Unicode and threading
support address important functional... 阅读全帖 |
|
t****t 发帖数: 6806 | 17 doesn't matter, std::move force the return value to be &&, so that it can be
bind to &&. otherwise, by default it will select & to bind.
emplace_back uses std::forward, so if you call with const lvalue, it will co
nstruct (const) lvalue, if you call rvalue, it will construct rvalue. so yo
u have to force with std::move(). |
|
l*******b 发帖数: 2586 | 18 嗯? 补充一点, 如果同时定义了 const &做参数的函数。lvalue 会用const & 函数,
rvalue用&&函数。
好处是rvalue直接用move semantics, 省了一次copy |
|
m*********a 发帖数: 3299 | 19 今天给c++震惊了
(*p).和p->居然是不一样的
p->返回的是lvalue
(*p).是lvalue 如果他的值是lvalue,是rvalue如果返回的值是rvalue
觉得(*p).更合理
想不明白,为啥p->一定要返回lvalue
如果p->返回一个12的值,难道这个12的值,临时放在int tmp=12中
p->xxx=100; 这样临时的tmp值就是100了?
没有想到他有啥用途 |
|
m*********a 发帖数: 3299 | 20 f()
你的f().x是lvalue
看看我的const static int 是不是rvalue
不能进行test.y的赋值
我不知道是因为const还是因为rvalue
struct A {
const static int y=10;
int x;
};
A f() { return A();}
int main() {
A test;
int a=test.y;
test.y=15;
} |
|
m*********a 发帖数: 3299 | 21 这儿这么多的c/c++ 的程序员,到现在给出
dot operator 的rvalue都是错的,难道他们都有问题
他们觉得是rvalue的东西,实际上是lvalue
你还觉得这个设计是合理的? |
|
m*********a 发帖数: 3299 | 22 code::block 还没有fix 这个bug
还是可以修改的
但是现在知道标准是 rvalue
就和 A f()
f().x是rvalue
就是在code::block中可以 assign
所以实践不一定是检验真理(标准)的唯一方法
以前 很confuse,现在你说是bug就解决问题了 |
|
D***n 发帖数: 6804 | 23 你需要知道编译器在看到你这段话的时候真正干了啥。
1)当编译器看到const的时候,它知道这个东西是不会改变的。
2)当编译器看到static的时候,它知道要把这个东西放到一个特殊的内存区域,并且
在程序载入的时候初始化(理解这点特别重要)。
一个东西又是const又是static,理论上来说,应该在内存静态变量区创建一个变量,
把具体数字塞进去,然后其他人在访问结构的时候可以通过地址访问它....
但是实际上,编译器会在相应的struct的代码段上直接计算出常量并且写进去(内存访
问两次跳跃),一个在代码段的常量当然无法赋值。
你那个程序的main实际上是这样的:
int main() {
A test;
int a=10;
10=15; /* 错误 */
}
理解了这一点你可以省掉那些 C++书上一万个blah, blah, blah
f()
你的f().x是lvalue
看看我的const static int 是不是rvalue
不能进行test.y的赋值
我不知道是因为const还是因为rvalue
struct A {
const static int y=... 阅读全帖 |
|
z*******h 发帖数: 346 | 24 https://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c
++11.html
vector变量是allocate在stack上,但是里面的东西是allocate在heap上,这样move
semantics就allocate一个新的vector object(里面就装size和一个pointer,不费内存
),但是C++11就不在heap上重新为vector里面的东西allocate memory了,它就偷偷地
把rvalue vector里面的pointer偷过来。
你的vector里面装的是指针,那么这些指针们allocate在heap上,每个再指向那些heap
上的pole们。我觉得你直接在vector里装pole不更省事吗? |
|
i**r 发帖数: 40 | 25 It might have to do with a compiler optimization technique call Return
Value Optimization(RVO).
Both f1 and f2 are pass-by-value and return-by-value, therefore
calling function f1 or f2 will make at least 2 copies of object.
The f1 function call:
C second = f1(first);
is within an assignment statement, in theory this statement should
call copy ctor 3 times.
However, since the return value of f1 is an rvalue, i.e. temporary,
and will be destroyed after the assignment operation, AND the return
val |
|
c**********e 发帖数: 2007 | 26 int x;
function () =x;
Is the assignment statement in the sample code above legal or illegal?
a) It is legal if the return type of function is a reference to int.
b) It must be illegal since the left side of the assignment operator is not
an rvalue.
c) It must be illegal since the left side of the assignment operator is not
an lvalue.
d) It is legal if the return type of function is a pointer to int.
d) It is legal if there is an overloaded, non-member assignment operator. |
|
g****y 发帖数: 240 | 27 c++11 有rvalue reference。 应该可以消除你说第一个问题。 第二个问题,返回
reference就可以了。
file |
|
G*****7 发帖数: 1759 | 28 wonder if anyone please contribute some tricky c++/software engr quizs so
that i can fail one completely and let the other pass with flying colors.
i am thinking, ask the laoyin to do a morris in-order and explain rvalue
reference and move constructor, then ask the laozhong about regular in-order
traversal, reference and copy constructor.
but i am not sure if this will definitely kill the former. any other
suggestions? |
|
s*******5 发帖数: 58 | 29 貌似signature不一样,emplace要rvalue |
|
p**********9 发帖数: 3463 | 30 买了那个薄膜的, 把主卧4个窗户全封上了,感觉好多了,起码没冷风进来了。
那么薄的东西, 号称能提高Rvalue 90%.要等到春天才拔了它们。。。 |
|
G*****7 发帖数: 1759 | 31 【 以下文字转载自 JobHunting 讨论区 】
发信人: Glock17 (semi-auto), 信区: JobHunting
标 题: Will phone interview a lao-uh-san and a chinese folk next week
发信站: BBS 未名空间站 (Sun Sep 8 11:18:43 2013, 美东)
wonder if anyone please contribute some tricky c++/software engr quizs so
that i can fail one completely and let the other pass with flying colors.
i am thinking, ask the laoyin to do a morris in-order and explain rvalue
reference and move constructor, then ask the laozhong about regular in-order
traversal, referenc... 阅读全帖 |
|
r****y 发帖数: 26819 | 32 是这么回事。有意思的是,java里不讲lvalue和rvalue,用的是variable和value这两
个词。JLS里说variable指的是一个存储地址及其相关类型,或者叫编译类型。(4.12)
variable是用来hold一个value的。而return expression返回的一定是个value。(14.
17) |
|
L*********r 发帖数: 92 | 33 靠, 你问的是这一个.
我招了.
我对rvalue的理解不够. 多谢指点.
nnd, 连这么小的错误都不能犯吗? |
|
t****t 发帖数: 6806 | 34 it happens that these temp objects are rvalues, so it's const.
it's not often to write like cosnt B& rb=B(); but it's very normal in
function calls, like
void foo(const B& b);
int main()
{
foo(B());
}
if you declare foo as void foo(B&), the call will fail. |
|
c********x 发帖数: 84 | 35
the difference is the rvalue determine the type of the lvalue needed to cast.
if ( 0 == x ) if x is float, 0 is casted to 0.0f. |
|
t****t 发帖数: 6806 | 36 += 返回lvalue in perl and C++, 返回rvalue in C, 这些我很清楚
但是这些都不重要, 因为就算在C也返回lvalue, 你也不能再做一次赋值, 就这么简单
我真是在对牛弹琴, 浪费时间, 晕死
edition |
|
b***y 发帖数: 2799 | 37 ☆─────────────────────────────────────☆
dArtagnan (达达尼昂) 于 (Fri Jul 25 15:27:17 2008) 提到:
++i;
i++;
我知道++i 和 i++ 的区别在于如果作为rvalue 给出的值不一样。
但是面试被人问到上面两个语句有没有任何区别,我当时一口咬定没有区别,不过其实
还是有点心虚的......
☆─────────────────────────────────────☆
TaiYouCai (有才) 于 (Fri Jul 25 15:32:12 2008) 提到:
c++ faq呀
☆─────────────────────────────────────☆
GreenBean (I am THE Greenbean) 于 (Fri Jul 25 15:38:01 2008) 提到:
有啊
int i=5;
j=++i; //j=6, i = 6
int i=5;
j=i++; //j=5, i=6
☆────────────────────────────── |
|
C*******l 发帖数: 105 | 38 C++中有些code把函数返回值定义成const,这样做的好处是什么?我的理解是函数返
回值已经是rvalue了,已经不能改变了,但为什么还要在函数定义时写上const,这是
不是多此一举? |
|
m*****r 发帖数: 130 | 39 这里r2是一个reference to a const int, r1+i结果是一个const int,一个临时变量,
可以被
r2引用, 作为rvalue. |
|
s*******e 发帖数: 664 | 40 ☆─────────────────────────────────────☆
ilvch (From here to eternity) 于 (Mon Jun 22 19:52:58 2009, 美东) 提到:
我们经常会写返回lvalue和rvalue的access function, 比如下面的程序.
突然想到两个x1()函数的signature好象是一样的吧?
这个算overloading function么?
C++标准是怎么定义的呢?
#include
using namespace std;
class LR {
int x;
public:
LR():x(-1) {}
const int& x1() const { return x; }
int& x1() { return x; }
void print() { cout << "x = " << x << endl;}
};
int
main() {
LR lr;
int y1 = lr.x1(); // return rval |
|
X****r 发帖数: 3557 | 41 I think they are wrong, because what you said is called
function-to-pointer conversion:
4.3 Function-to-pointer conversion [conv.func]
1 An lvalue of function type T can be converted to an rvalue of type
"pointer to T." The result is a pointer to the function.
However, there is a footnote specifically saying:
* This conversion never applies to nonstatic member functions because
an lvalue that refers to a nonstatic member function cannot be ob-
tained.
as |
|
d****p 发帖数: 685 | 42 C++不规定计算子表达式的次序(除了&& || :?是例外).
以这个例子来说,=左右是两个子表达式,所以可以先左后右或是反过来.
这个和操作符的优先次序是两回事.操作符优先次序适用于同一个操作数能被两个操作
符作用时,取那一个避免歧义.C++没
有特定次序运算子表达式,是为了支持优化,代价是希望编码员不要写出上述导致歧义的
代码.
虽然标准没有规定次序,但具体的编译器肯定有内部次序(既然标准没规定).我胡乱猜测
a[i]优先可能的原因(1)lvalue优先,因
为优化多针对rvalue(2)[]的优先级高于postfix ++? |
|
H****r 发帖数: 2801 | 43
direct-
Thrust 大牛讲的很好啊! 不过偶还是有点没太搞清楚,这个standard 8.5, clause
14 是啥?
还有这个C++0x rvalue references不是说可以用temporary object吗? |
|
t****t 发帖数: 6806 | 44 standard是c++ 03的标准, 8.5/14是里面的章节.
0x是0x, 不能混为一谈. 况且reference to rvalue用的是&&, 明显跟reference to
lvalue(&)不是一回事. |
|
t****t 发帖数: 6806 | 45 yes, that *a is a typo. and removing the twist, yes, compiler most probably
will give the result you expect. (but the program remains undefined.)
but no, your understanding is wrong. the target of an arbitrary cast pointer
is not undefined. but you can not alias it. the rule of thumb here is, do
not cast lvalue [and access it], but you can cast rvalue. casting a pointer
to another type is ok, but accessing through that pointer is usually not (
unless it is compatible).
you
you
bit |
|
X****r 发帖数: 3557 | 46 数组和指针是两回事。
比如int a[10];定义了一个有10个int元素的数组,sizeof(a) == sizeof(int) * 10
而int *p;定义了一个指向一个int的指针,sizeof(p) == sizeof(int*)
之所以会有数组就是指针的混淆是因为int [10]类型可以自动转换成int *类型,这种
转换被称为array-to-pointer conversion,所有左值(lvalue)表达式作为右值
(rvalue)使用的时候都要经过这种转换,而转换结果就是指向该数组首元素的指针,
所以a的值就相当于&a[0],但是即使赋值p=a也不能认为它们是一回事,比如
&a和&p的类型和值就完全不同,因为这里&a并不是将a当作右值来用所以array-to-
pointer
conversion不适用。
数组的数组就是字面上的意义:一个数组的每个元素都是数组。
比如int a2[5][10];定义了一个有5个int [10]元素的数组,sizeof(a2) ==
sizeof(int [10]) * 5,即sizeof(int) * 10 * 5
而指针数组int... 阅读全帖 |
|
f*******n 发帖数: 12623 | 47 operator++() is for pre-increment (++x)
operator++(int) is for post-increment (x++)
Because both pre and post are unary operators, there is no way to tell them
apart, so C++ made a special case, and post-increment / post-decrement take
an additional int parameter.
Pre-increment returns a reference, because a pre-increment expression is an
lvalue (you can assign to it or take the address of it, etc.). Post-
increment returns a copy, because a post-increment expression is a rvalue.
呢? |
|
|
d***a 发帖数: 13752 | 49 Exactly. In C++, if a reference is bound to a rvalue, it must be a const
reference.
which
doesn
cout
r
instead |
|
G***l 发帖数: 355 | 50 两本都是好书。primer高级一点,primer plus是入门级的,虽然名字看上去高级点。
两者内容有一定重复。如果你c++基础不是特别好的话就先读primer plus,再看primer
,然后做做project,再读effective c++。这些搞完你基本就可以自称能熟练使用c++
了。想学点奇技淫巧写一些祸害别人祸害自己的代码的话,可以再看看Modern C++
Design: Generic Programming and Design Patterns Applied。
最后可以看看c++11的一些feature跟实现,比如说蛋疼的rvalue reference,move
construtor。。。 |
|