p****n 发帖数: 69 | 1 It is understood that auto_ptr should not be used with STL container.
For example, it is seriously wrong to call sort from header to
sort a vector>, if the implementation uses quick sort and a
pivot, a copy of some element, is used.
Unique_ptr has the same feature of taking ownership when copying as auto_ptr
. I know that unique_ptr's assignment operator uses rvalue reference, but
the same problem in the above example remains: the pivot takes ownership of
some element, ... 阅读全帖 |
|
k********a 发帖数: 101 | 2 typecast的结果是个rvalue,不能放在assignment operator左边吧。 |
|
G*****7 发帖数: 1759 | 3 【 以下文字转载自 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... 阅读全帖 |
|
a*****i 发帖数: 268 | 4 需要定义一个copy constructor,但不会被调用。
MS的不出错是因为MS的编译器作了extension,可以用non-const reference绑定rvalue
。这个extension可能是为了编译一些old code。可以用/Za来disable,也可以用/W4来
看到warning。 |
|
k***s 发帖数: 277 | 5 最近看了BS的TCPL 4th,觉得新特性加得太贴心(个人经验)
- auto, decltype, declval, meta programming/template的利器
- lambda,非常爽的特性
- rvalue reference &&, temporary object 的终极优化
- varidic, 可变长template参数列表, meta/template 利器
- {} 初始化列表,刚接触时觉得很变态,不过习惯了觉得很强大
很期望14、17的增强会 带来更多惊喜
part |
|
N******K 发帖数: 10202 | 6 std::move rvalue reference
move constructor
这些东西真是好用
现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意
初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用
任何并行库的条件下
矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了
举个例子:
A B C为矩阵
c++代码
C = 1.0 + A*A + A * (10.0 + A*B({0,1,2}, {0,1,2}));
Matlab代码
C = 1.0 + A*A + A * (10.0 + A*B([1,2,3], [1,2,3])); |
|
|
|
a*****e 发帖数: 1700 | 9 你应该把声明和赋值分开,才好理解。比如:
int a;
int b;
以上声明,a 和 b 各有一个 stack 上的地址。
a = 1;
b = a;
赋值的时候,要把 lvalue 和 rvalue 区分开,才好理解。比如上面两句可以改写为以
下形式:
write(&a, 1);
write(&b, a);
&a 表示取了变量 a 的地址,a 表示变量 a 所存储的值。write(X, Y) 表示向地址 X
写入值 Y。 |
|
a*****e 发帖数: 1700 | 10 你这是 java 还是 C 还是 C++?
没什么不同,不管是不是 static,都是内存里面的地址,有堆和栈的区别,也有 per
object 和 per class 的区别,但不影响你理解赋值的 lvalue 和 rvalue。
static 与否,唯一影响的是 scoping。就是说用到一个变量的时候,是指的哪个地方
声明的这个变量。
理解编程语言,理解它的语义是一方面,理解它的实现是另一方面。两者可以相互促进
理解,但是能区分开最好。 |
|
T******7 发帖数: 1419 | 11 最近revisited C++11,得出一个感慨。scala比c++还是简单多了
c++堪称坑多,范围广,写法多且潇洒。
type trait
template related topic
smart pointer
const
都是坑很多
更别提 一堆 lvalue, rvalue, xvalue的 特殊规定 |
|
t**r 发帖数: 3428 | 12 你必須去改那個類,
for your reference:
#include
#include
struct A {
std::string s;
A() : s("test") {}
A(const A& o) : s(o.s) { std::cout << "move failed!n";}
A(A&& o) : s(std::move(o.s)) {}
};
A f(A a) {
return a;
}
struct B : A {
std::string s2;
int n;
// implicit move contructor B::(B&&)
// calls A's move constructor
// calls s2's move constructor
// and makes a bitwise copy of n
};
struct C : B {
~C() {}; // destructor prevents ... 阅读全帖 |
|
G***l 发帖数: 355 | 13 哦,我看错了,以为他那个function是template的,没注意是class template。那样就
没有问题了,只能用rvalue调用。 |
|
m*********a 发帖数: 3299 | 14 原话
The arrow operator requires a pointer operand and yields an lvalue.
The dot operator yields an lvalue if the object from which the member is
fetched is an lvalue; otherwise the result is an rvalue. |
|
m*********a 发帖数: 3299 | 15 primer c++ 5
The arrow operator requires a pointer operand and yields an lvalue.
The dot operator yields an lvalue if the object from which the member is
fetched is an lvalue; otherwise the result is an rvalue. |
|
m*********a 发帖数: 3299 | 16 这个是
primer c++ 5
The arrow operator requires a pointer operand and yields an lvalue.
The dot operator yields an lvalue if the object from which the member is
fetched is an lvalue; otherwise the result is an rvalue.
除非这个是不对的,啥叫原版?我没有看过中文的计算机教程
对我来说,英文比中文好理解
所以,批评别人,也要看看自己的批评的方向对不对 |
|
|
m*********a 发帖数: 3299 | 18 我明白你的意思
不过你的例子不对
((a){1}).x是lvalue,可以assign
a{1}.x=100是可以的
rvalue |
|
m*********a 发帖数: 3299 | 19 你的例子当然是可以赋值的
他的例子了也是可以赋值的
所以都是assignable lvalue
你先把lvalue 和 rvalue搞清楚再说吧 |
|
m*********a 发帖数: 3299 | 20 现在就是看c++ primer 5,然后做习题
有许多东西和讲的不一致,现在知道是code::block没有执行标准的bug
rvalue都是可以assign 的
A& f()
和A f()返回同样的东西
所以我到这儿问问,大家是老人知道的多一点
Edition) |
|
D***n 发帖数: 6804 | 21 如果是涉及Science方面的计算,C++需要学因为有些库是C++写的。
1)Science 用的C++的和普通计算机行业用的不是一个方向,很多C++细枝末节的东西
都用不到。
2)Numpy/Scipy/Matlab/xxxLab(忘了)更重要。Python有个特别的好处是可以直接挂
那些C++的库的接口,这样用起库来更像一个脚本语言。
3)C++,Java等语言有一大堆特性是给印度程序员用的,比如什么Lvalue/xvalue/
rvalue/rpvalue/lpvalue等等等等。你完全可以忽略。 |
|
A*******e 发帖数: 2419 | 22 以下两个函数到底有啥区别?
void Foo(X&& x);
void Foo(const X& x); |
|
N******K 发帖数: 10202 | 23 void Foo(X&& x) 说明这个x是个临时变量 你可以在这个函数里面把它给吃掉
void Foo(const X& x); 这个x不能修改 你不能在这个函数里面吃掉它 |
|
m*********a 发帖数: 3299 | 24 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的权利,
无法改 |
|
m*********a 发帖数: 3299 | 25 如果有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 | 26 什么叫吃掉?
Foo1(X&& x);
Foo2(const &X);
Foo1(X());
Foo2(X());
我是问上面这两个有什么区别。 |
|
A*******e 发帖数: 2419 | 27
这个
Foo(X& x)和Foo(const X& x)也可以传入临时变量调用啊。 |
|
|
A*******e 发帖数: 2419 | 29 这里说的很清楚。
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的参数将只能是右值。
如果同时定义,是不是就有二义性了? |
|
N******K 发帖数: 10202 | 30 文科生学程序 从书本到书本 到都来一头浆糊
我学程序 从例子到项目 根据debug模式 跟踪程序流程 就理解了这些基本问题 |
|
|
N******K 发帖数: 10202 | 32 程序是动态的 不可能从静态文字的书本或者帖子 你把c++全给理解了 |
|
|
e*******o 发帖数: 4654 | 34 【 以下文字转载自 biojailbreak 俱乐部 】
发信人: mdrosophila (ranger), 信区: biojailbreak
标 题: 总结,请给我转发programming版,我给封了
发信站: BBS 未名空间站 (Sun Dec 14 10:09:46 2014, 美东)
上次发帖,根据我的具体情况大家提了不少意见,对我以后的目标,有了更加清晰的认
识。对于已经工作的,给出的意见很感谢,对于正在努力的,就一起提高。以后希望能
一起搞点有意义的事。
准备选advanced bioinformatics , 已经学了bioinformatics,这样对于生物领域的
machine learning的算法基本上都完整了,然后系统的选一门专门讲普遍machine
learning和artificial intelligence 的课 (wdong).
数据库的话看来也得选一门(wdong)
对于C++,看了1/3primer c++后,发现具体的用法很多,很细。这是c++reference
book中没有讲的。nickmit 提到 码公的职责就是用简洁高效的代码写出... 阅读全帖 |
|
v******y 发帖数: 84 | 35 我看错了,可以是&, &&
对于一个class中fucntion, 除了()中传入参数之外,还implicit传入this
&的意思是传入的this 必须是lvalue, &&是rvalue
也可以是const, const&, const &&这二个组合 |
|
z****e 发帖数: 54598 | 36 作为论据,我找到了中文的翻译,但是那个youtub链接失效了
Go语言之父谈Go:大道至简
时间:2012-07-05 15:40 作者:王然
导读:这篇文章是Google首席工程师、Go语言之父Rob Pike自己整理的6月21日在旧金
山给Go SF的演讲稿。Rob提到:Go语言本是以C为原型,以C++为目标设计,但最终却大
相径庭。值得一提的是,这3门语言都曾当选TIOBE年度语言。
几个礼拜之前我被问到:“对于Go语言,最令你惊讶的是什么?”当时我就明确地给出
了答案:“虽然我希望C++程序员能够使用Go作为替代拼,但实际上大部分Go程序员都
是从Python和Ruby转过来的,其中却少有C++程序员。”
我、Ken以及Robert都曾是C++程序员,在我们编写软件时觉得应该设计一门更适合解决
这个问题的编程语言。奇怪的是,其他程序员似乎却不关心。
今天我将说说是什么让我们决定创造Go语言的,及其出乎意料的结果。这里我谈的更多
的会是Go而不是C++,所以即使你不懂C++也没关系。
主旨可以简单地总结为:你更同意Less is more还是Less is less?
这里有一个... 阅读全帖 |
|
B*******g 发帖数: 1593 | 37 能不能从heap move到static我不确定, 但你这个s不是rvalue, compiler不会让move吧
? 你的三个变量不能直接初始化吗? 为什么一定要从另一个变量copy/move?
又看了下, 应该可以写move constructor和move assignment operator
listen_ |
|
b***i 发帖数: 3043 | 38 【新问题】
4. boost::format的返回值是string吗,我应该用string&吗?
比如: std::string& str = boost::format(......);
std::cout<
throw ... (str);
这样可以省掉一个复制吧?
5. 类UUU的static函数里面
static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
...
就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。
今天reviewer说要我改成把un放到类UUU这一层去,而不是在函数里面。这样就不能避
免启动问题了。而且很麻烦,因为不是简单的整数,浮点数等,是不知道怎么实现的类
(有头文件)。大家说我的做法对不对?另外我这样做是照着其他人写的抄的。有一个
人告诉我这样写好
6. 搜索rvalue reference vari... 阅读全帖 |
|
w***g 发帖数: 5958 | 39 据我的理解, 4的写法是错的. 应该是 string str = boost::format(...).
str = 翻译出来是一个rvalue copy constructor, 应该直接用swap优化了.
考。 |
|
i***c 发帖数: 26 | 40 new std::vector(PoleAccess::Load(...)) 是 move construct,PoleAccess:
:Load的返回值没有名字,是rvalue |
|
|
b***i 发帖数: 3043 | 42 我们项目中有很多warning,其中有大量我认为是错误的,比如
const MyClass& GetSome(){
return MyClass(... constructor);
}
这种虽说编译不出错,但是是不是不对?
我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
他说,这是extend the life time of temporary。
但是 我认为他说的 不对 。他说的 其实 是
const MyClasss& abc = someFunc(); // someFunc() returns an object
而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆
栈错误。这个我试过了,是Undefined。我同事有个演示,能正常使用。我把他
constructor里面的std::cout删掉后就不能正常使用了。
这种是不是得告诉公司,不能这么写啊?虽然现在没有问题,主要是这些代码没有被调
用过。 |
|