A*******e 发帖数: 2419 | 1 以下两个函数到底有啥区别?
void Foo(X&& x);
void Foo(const X& x); |
N******K 发帖数: 10202 | 2 void Foo(X&& x) 说明这个x是个临时变量 你可以在这个函数里面把它给吃掉
void Foo(const X& x); 这个x不能修改 你不能在这个函数里面吃掉它
【在 A*******e 的大作中提到】 : 以下两个函数到底有啥区别? : void Foo(X&& x); : void Foo(const X& x);
|
m*********a 发帖数: 3299 | 3 void Foo(X&& x);
x可以是temporary object, unnamed variable就是不用命名的variable就可以调用这个
void Foo(X& x);
x是named object,x就是bound到调用函数的 object,没有copy,改x就是改调用函数的
object
void Foo(const X& x);
x是named object,x就是bound到调用函数的 object,没有copy,但是限制了改x的权利,
无法改
【在 A*******e 的大作中提到】 : 以下两个函数到底有啥区别? : void Foo(X&& x); : void Foo(const X& x);
|
m*********a 发帖数: 3299 | 4 如果有MyClass
foo(MyClass())就会调用foo(MyClass&&)
MyClass()产生一个新的unamed object
如果先定义一个
MyClass myClass;
foo(myClass)就是调用foo(MyClass&)或者foo(const MyClass &)
foo(MyClass&)和foo(const MyClass &)虽然signature 不同
但是不能overload.
虽然const这儿是low level modifier, 但是const low level可以接受nonconst 和
const的variable |
A*******e 发帖数: 2419 | 5 什么叫吃掉?
Foo1(X&& x);
Foo2(const &X);
Foo1(X());
Foo2(X());
我是问上面这两个有什么区别。
【在 N******K 的大作中提到】 : void Foo(X&& x) 说明这个x是个临时变量 你可以在这个函数里面把它给吃掉 : void Foo(const X& x); 这个x不能修改 你不能在这个函数里面吃掉它
|
A*******e 发帖数: 2419 | 6
这个
Foo(X& x)和Foo(const X& x)也可以传入临时变量调用啊。
【在 m*********a 的大作中提到】 : void Foo(X&& x); : x可以是temporary object, unnamed variable就是不用命名的variable就可以调用这个 : void Foo(X& x); : x是named object,x就是bound到调用函数的 object,没有copy,改x就是改调用函数的 : object : void Foo(const X& x); : x是named object,x就是bound到调用函数的 object,没有copy,但是限制了改x的权利, : 无法改
|
N******K 发帖数: 10202 | 7 我说的临时变量 是一个函数返回一个object 这个东西是临时变量 也叫做 rvalue
fun_return_object() 返回一个 object
Foo(X& x) 不能这么用;Foo(fun_return_object())
Foo(X&& x) 可以这么用;Foo(fun_return_object())
【在 A*******e 的大作中提到】 : : 这个 : Foo(X& x)和Foo(const X& x)也可以传入临时变量调用啊。
|
A*******e 发帖数: 2419 | 8
const &肯定可以这么用。
【在 N******K 的大作中提到】 : 我说的临时变量 是一个函数返回一个object 这个东西是临时变量 也叫做 rvalue : fun_return_object() 返回一个 object : Foo(X& x) 不能这么用;Foo(fun_return_object()) : Foo(X&& x) 可以这么用;Foo(fun_return_object())
|
A*******e 发帖数: 2419 | 9 这里说的很清楚。
http://jxq.me/2012/06/06/%E8%AF%91%E8%AF%A6%E8%A7%A3c%E5%8F%B3%
如果你实现了void foo(X&);,但是没有实现void foo(X&&);,那么和以前一样foo的参
数只能是左值。如果实现了void foo(X const &);,但是没有实现void foo(X&&);,仍
和以前一样,foo的参数既可以是左值也可以是右值。唯一能够区分左值和右值的办法
就是实现void foo(X&&);。最后,如果只实现了实现void foo(X&&);,但却没有实现
void foo(X&);和void foo(X const &);,那么foo的参数将只能是右值。
如果同时定义,是不是就有二义性了?
【在 A*******e 的大作中提到】 : : const &肯定可以这么用。
|
N******K 发帖数: 10202 | 10 文科生学程序 从书本到书本 到都来一头浆糊
我学程序 从例子到项目 根据debug模式 跟踪程序流程 就理解了这些基本问题
【在 A*******e 的大作中提到】 : 这里说的很清楚。 : http://jxq.me/2012/06/06/%E8%AF%91%E8%AF%A6%E8%A7%A3c%E5%8F%B3% : 如果你实现了void foo(X&);,但是没有实现void foo(X&&);,那么和以前一样foo的参 : 数只能是左值。如果实现了void foo(X const &);,但是没有实现void foo(X&&);,仍 : 和以前一样,foo的参数既可以是左值也可以是右值。唯一能够区分左值和右值的办法 : 就是实现void foo(X&&);。最后,如果只实现了实现void foo(X&&);,但却没有实现 : void foo(X&);和void foo(X const &);,那么foo的参数将只能是右值。 : 如果同时定义,是不是就有二义性了?
|
A*******e 发帖数: 2419 | 11 理解再深刻,表达不清也不行啊。:)
【在 N******K 的大作中提到】 : 文科生学程序 从书本到书本 到都来一头浆糊 : 我学程序 从例子到项目 根据debug模式 跟踪程序流程 就理解了这些基本问题
|
N******K 发帖数: 10202 | 12 程序是动态的 不可能从静态文字的书本或者帖子 你把c++全给理解了
【在 A*******e 的大作中提到】 : 理解再深刻,表达不清也不行啊。:)
|
k**********g 发帖数: 989 | |