avatar
C++ 11问题:emplace_back()# Programming - 葵花宝典
Y*2
1
和他们家族的发家史,还有当时19世纪末,一直到宋美龄去世时候KMD的历史。
感慨万千啊...人活一辈子应该像他们一样,有理想,有目标,有抱负。
还有就是
fuck Japan!
avatar
o*r
2
印度某村落,一男童竟然与一只小狗结为夫妻,全村的人都来祝贺。这种闻所未闻的事
情,据说在印度的落后村落,很是盛行。
结婚的目的,为了传宗接代,实现儿孙满堂,天伦之乐。成家立业,感受成长的快乐和
家庭的温暖。但是人和狗结婚,是实现不了以上愿望的。并且狗的寿命只有14年左右,
至今跨越种族的爱,也不能长久。事实上,人没有那么伟大,用狗作为媒介,辟邪驱鬼
而已。
因为当地人没有文化,对于未来的期望都压在了占卜上面。如果你被占卜到凶兆,就要
与狗结婚,来抵挡厄运。这个男童被占卜到第一任妻子早死,并且上颚会长出牙齿,必
须与狗结婚。还有,一个十几岁的女孩、30岁的男人都被迫与狗结婚。村民纷纷前来道
贺,给狗穿上嫁衣,仪式也不能落下。
当地政府虽然反对这种封建迷信的行为,但是根植于民族很深的愚昧就像经久不衰的历
史那样坚实的存在着。
不知道该不该嘲笑他们,因为中国的封建社会持续了那么久,封建思想至今没有清除干
净。像看手相、讲风水,在民间也是不亦乐乎的事情。有些明星、达官显贵都是苦求大
师给自己孩子取名字,给别墅选址……
看别人就像照镜子,照出来的到底是人是妖,自己判断。
avatar
N*m
3
我用server,没觉得suse跟fedora有啥区别
avatar
d*3
4
我觉得这个code是可以compile的,因为emplace_back()既不会copy也不会move。
class Person {
public:
Person(string name) { }
Person(const Person&) = delete;
};
int main() {
vector persons;
persons.emplace_back("George");
}
可是竟然报错:“reference a deleted function Person(cont Person&)"
试了gcc 4.7.1, VS2012, VS2013, 都报错。难道我对emplace_back()的理解有错吗?
avatar
r*y
5
谁推荐个其他板块吧。
avatar
z*n
6
就算不迷信,还看到个新闻说男孩和娃娃结婚
avatar
r*c
7
和Arch还是有点区别的。而且deb系还有redhat的包管理不同。
再者,如果玩计算用库等等这些,有时候发行版包更新的速度也不同的。
avatar
d*i
8
发现C++11的设计上的几个严重问题:滥用existing keyword,乱加语法糖,都什么货
色在搞,太糟踏C++了。哈哈,我自岿然不动,还是用我的plain old ANSI C++98。

【在 d******3 的大作中提到】
: 我觉得这个code是可以compile的,因为emplace_back()既不会copy也不会move。
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: vector persons;
: persons.emplace_back("George");
: }

avatar
K*a
9
那也是fuck那个时期的japan

【在 Y*****2 的大作中提到】
: 和他们家族的发家史,还有当时19世纪末,一直到宋美龄去世时候KMD的历史。
: 感慨万千啊...人活一辈子应该像他们一样,有理想,有目标,有抱负。
: 还有就是
: fuck Japan!

avatar
d*i
10
还是老老实实写成这样吧,读起来不省心很多吗?
class Person {
public:
Person(string name) : personName(name) { }
private:
string personName;
Person(const Person&);
};
int main() {
vector persons;
Person george("George");
persons.push_back(george);
}

【在 d******3 的大作中提到】
: 我觉得这个code是可以compile的,因为emplace_back()既不会copy也不会move。
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: vector persons;
: persons.emplace_back("George");
: }

avatar
K*a
11
哦,现在只有有钱,有权,有女人的说法了

【在 Y*****2 的大作中提到】
: 和他们家族的发家史,还有当时19世纪末,一直到宋美龄去世时候KMD的历史。
: 感慨万千啊...人活一辈子应该像他们一样,有理想,有目标,有抱负。
: 还有就是
: fuck Japan!

avatar
e*w
12
要放入容器还是需要copy ctor

【在 d******3 的大作中提到】
: 我觉得这个code是可以compile的,因为emplace_back()既不会copy也不会move。
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: vector persons;
: persons.emplace_back("George");
: }

avatar
Y*2
13
我也想起义。

【在 K*a 的大作中提到】
: 那也是fuck那个时期的japan
avatar
S*I
14
不如用plain old ANSI C90。

【在 d****i 的大作中提到】
: 发现C++11的设计上的几个严重问题:滥用existing keyword,乱加语法糖,都什么货
: 色在搞,太糟踏C++了。哈哈,我自岿然不动,还是用我的plain old ANSI C++98。

avatar
d*d
15
不如你去wall st坐坐?

【在 Y*****2 的大作中提到】
: 我也想起义。
avatar
d*3
16
不会compile的

【在 d****i 的大作中提到】
: 还是老老实实写成这样吧,读起来不省心很多吗?
: class Person {
: public:
: Person(string name) : personName(name) { }
: private:
: string personName;
: Person(const Person&);
: };
: int main() {
: vector persons;

avatar
Y*2
17
我不支持他们啊
我心像着wall street.

【在 d********d 的大作中提到】
: 不如你去wall st坐坐?
avatar
t*t
18
没用过就不要出来瞎嚷嚷了.

【在 d****i 的大作中提到】
: 发现C++11的设计上的几个严重问题:滥用existing keyword,乱加语法糖,都什么货
: 色在搞,太糟踏C++了。哈哈,我自岿然不动,还是用我的plain old ANSI C++98。

avatar
d*d
19
哈哈纽约的都是

【在 Y*****2 的大作中提到】
: 我不支持他们啊
: 我心像着wall street.

avatar
t*t
20
persons.emplace_back(std::move("George"));

【在 d******3 的大作中提到】
: 我觉得这个code是可以compile的,因为emplace_back()既不会copy也不会move。
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: vector persons;
: persons.emplace_back("George");
: }

avatar
K*a
21
嘿嘿。。。那就参加各游行把。。“we are the 90%"

【在 Y*****2 的大作中提到】
: 我也想起义。
avatar
d*3
22
大牛你这move的是string还是Person呀?

【在 t****t 的大作中提到】
: persons.emplace_back(std::move("George"));
avatar
K*a
23
养肥了你们

【在 Y*****2 的大作中提到】
: 我不支持他们啊
: 我心像着wall street.

avatar
t*t
24
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().

【在 d******3 的大作中提到】
: 大牛你这move的是string还是Person呀?
avatar
d*3
25
找到正解了。emplace_back()既不copy也不move。但是vector要求里面的个体或者copy
constructible,或者move constructible。所以下面的代码是可以编译的,因为
deque没有这个要求:
class Person {
public:
Person(string name) { }
Person(const Person&) = delete;
};
int main() {
deque persons; // changed to deque
persons.emplace_back("George");
}
如果一定要用vector,也可以这样:
class Person {
public:
Person(string name) { }
Person(const Person&) = delete;
Person(Person&&) = default; // move constructor
};
int main() {
vector persons;
persons.emplace_back("George");
}
这样vector的要求就满足了。
avatar
x*u
26
用C++11里面的lambda语法写写异步程序,就知道这狗屁东西有多么的丑陋了。

【在 t****t 的大作中提到】
: 没用过就不要出来瞎嚷嚷了.
avatar
b*s
27
有么?

【在 x****u 的大作中提到】
: 用C++11里面的lambda语法写写异步程序,就知道这狗屁东西有多么的丑陋了。
avatar
x*u
28
找几个VS12的sample看看吧,这东西的确功能很强大,但语言本身设计的跟狗屎一样恶
心。

【在 b*******s 的大作中提到】
: 有么?
avatar
b*s
29
不用vs

【在 x****u 的大作中提到】
: 找几个VS12的sample看看吧,这东西的确功能很强大,但语言本身设计的跟狗屎一样恶
: 心。

avatar
x*u
30
MS算是现存最大的CPP粉丝了。

【在 b*******s 的大作中提到】
: 不用vs
avatar
d*3
31
大牛是在用Asio?

【在 x****u 的大作中提到】
: 用C++11里面的lambda语法写写异步程序,就知道这狗屁东西有多么的丑陋了。
avatar
m*l
32
clang, gcc

【在 x****u 的大作中提到】
: MS算是现存最大的CPP粉丝了。
avatar
m*l
33
这个是boost吧?
她可能说async()
or future/promis
or
packaged_task

【在 d******3 的大作中提到】
: 大牛是在用Asio?
avatar
a*e
34
有一点很有意思,虽然编译的时候要求有copy或者move constructor,但是实际上并不
一定会使用。比如运行下面的例子:
class Person {
public:
Person(string name): name_(name)
{ cout << "in normal constructor" << endl; }
Person(const Person&)
{ cout << "in copy constructor" << endl; }
Person(Person&&)
{ cout << "in move constructor" << endl; }
private:
string name_;
};
int main()
{
vector persons;
persons.emplace_back("George");
};
output:
in normal constructor
这个情况有点象initialization
Person p = string("George");
版上前段时间讨论过类似的问题。

copy

【在 d******3 的大作中提到】
: 找到正解了。emplace_back()既不copy也不move。但是vector要求里面的个体或者copy
: constructible,或者move constructible。所以下面的代码是可以编译的,因为
: deque没有这个要求:
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: deque persons; // changed to deque

avatar
t*t
35
in real cases, ppl may not want their class to be copyable, but instead
moveable. in c++03 you will have to use a lot of tricks to do that, but c++
11 is much better.

【在 d****i 的大作中提到】
: 还是老老实实写成这样吧,读起来不省心很多吗?
: class Person {
: public:
: Person(string name) : personName(name) { }
: private:
: string personName;
: Person(const Person&);
: };
: int main() {
: vector persons;

avatar
t*t
36
这个有问题, 我感觉是编译器的bug. 理论上你这个case应该有默认的move
constructor, 不需要自己声明一个.

copy

【在 d******3 的大作中提到】
: 找到正解了。emplace_back()既不copy也不move。但是vector要求里面的个体或者copy
: constructible,或者move constructible。所以下面的代码是可以编译的,因为
: deque没有这个要求:
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: deque persons; // changed to deque

avatar
m*l
37
好像是你如果定义了删除,她就不给你默认的了?

【在 t****t 的大作中提到】
: 这个有问题, 我感觉是编译器的bug. 理论上你这个case应该有默认的move
: constructor, 不需要自己声明一个.
:
: copy

avatar
t*t
38
我再研究一下.

【在 m*******l 的大作中提到】
: 好像是你如果定义了删除,她就不给你默认的了?
avatar
s*e
39
因为vector在扩张的时候可能需要copy all the elements,所以必须要有这个属性才
能召唤。

copy

【在 d******3 的大作中提到】
: 找到正解了。emplace_back()既不copy也不move。但是vector要求里面的个体或者copy
: constructible,或者move constructible。所以下面的代码是可以编译的,因为
: deque没有这个要求:
: class Person {
: public:
: Person(string name) { }
: Person(const Person&) = delete;
: };
: int main() {
: deque persons; // changed to deque

avatar
t*t
40
嗯, 这次又学会了一招: ........=delete也是definition的一种, 虽然叫deleted
definition, 但是这也算是声明过了...所以其它缺省的就通通没有了.

【在 m*******l 的大作中提到】
: 好像是你如果定义了删除,她就不给你默认的了?
avatar
d*i
41
ok, I see. So ppl prefer movable object over copyable object mainly because
of performance issue?

【在 t****t 的大作中提到】
: in real cases, ppl may not want their class to be copyable, but instead
: moveable. in c++03 you will have to use a lot of tricks to do that, but c++
: 11 is much better.

avatar
t*t
42
not necessary, you might just want to semantically limit the copy behaviour.
for example, unique_ptr<>, it's moveable, not copyable.

because

【在 d****i 的大作中提到】
: ok, I see. So ppl prefer movable object over copyable object mainly because
: of performance issue?

avatar
m*l
43
and it is an inline definition

【在 t****t 的大作中提到】
: 嗯, 这次又学会了一招: ........=delete也是definition的一种, 虽然叫deleted
: definition, 但是这也算是声明过了...所以其它缺省的就通通没有了.

avatar
d*3
44
这个有依据吗?我一直以为这是个declaration。

【在 m*******l 的大作中提到】
: and it is an inline definition
avatar
d*3
45
这就回答了前面aaee的问题了。

【在 s***e 的大作中提到】
: 因为vector在扩张的时候可能需要copy all the elements,所以必须要有这个属性才
: 能召唤。
:
: copy

avatar
m*l
46
C++ standard
8.4.3 Deleted definitions

【在 d******3 的大作中提到】
: 这个有依据吗?我一直以为这是个declaration。
avatar
m*l
47
1 A function definition of the form:
attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-
seqopt = delete ;
is called a deleted definition.
4 A deleted function is implicitly inline.

【在 m*******l 的大作中提到】
: C++ standard
: 8.4.3 Deleted definitions

avatar
d*3
48
有意思。
function_name = 0; // this is a function declaration
function_name = delete; // this is a function definition

【在 m*******l 的大作中提到】
: 1 A function definition of the form:
: attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-
: seqopt = delete ;
: is called a deleted definition.
: 4 A deleted function is implicitly inline.

avatar
x*u
49
clang有原配地位的就是OSX吧,ObjC才是正选啊。

【在 m*******l 的大作中提到】
: clang, gcc
avatar
b*s
50
unix/linux开发环境,有多少人只用原配的?

【在 x****u 的大作中提到】
: clang有原配地位的就是OSX吧,ObjC才是正选啊。
avatar
x*u
51
原配的有很多好处啊,随便加几个非官方源进来,出了问题说不清楚。

【在 b*******s 的大作中提到】
: unix/linux开发环境,有多少人只用原配的?
avatar
b*s
52
原配的太老,太局限,比如centos下的gcc还是4.4.7,很多新特性都用不了

【在 x****u 的大作中提到】
: 原配的有很多好处啊,随便加几个非官方源进来,出了问题说不清楚。
avatar
d*n
53
clang在对于c++新标准的推动和支持上做的很好

【在 x****u 的大作中提到】
: clang有原配地位的就是OSX吧,ObjC才是正选啊。
avatar
x*u
54
问题是clang只在Linux和MacOS上用的多啊,而这两个环境下C++没有Windows流行。

【在 d****n 的大作中提到】
: clang在对于c++新标准的推动和支持上做的很好
avatar
d*i
55
clang is mainly driven by Apple. So it is not as neutral as gcc. Apple was
trying to maintain its obj-c through clang. But people don't buy it because
obj-c is considered to be apple's own language, plus its syntax is ugly. In
traditional UNIX system, cc (and its variants) is the gold standard norm for
C compiler. gcc is just a GNU clone for cc on Unix.

【在 d****n 的大作中提到】
: clang在对于c++新标准的推动和支持上做的很好
avatar
d*n
56
现在clang好像可以在win下用,不过没有试过。。。

【在 x****u 的大作中提到】
: 问题是clang只在Linux和MacOS上用的多啊,而这两个环境下C++没有Windows流行。
avatar
d*n
57
google现在颇有些人在为clang贡献代码。
obj-c不太清楚,没有用过。不过从开源出来的
clang版本而言,抛开obj-c,clang还是一个对于gcc而言极有
竞争力的产品。好像现在openbsd还是其他一个bsd的版本,已经
替换gcc为clang了。
有竞争对于编译器的使用者而言,是好事情:)
gcc前段时间花大力气改进了内部的模块化,
我感觉clang的存在也是gcc做这个改进的驱动之一

because
In
for

【在 d****i 的大作中提到】
: clang is mainly driven by Apple. So it is not as neutral as gcc. Apple was
: trying to maintain its obj-c through clang. But people don't buy it because
: obj-c is considered to be apple's own language, plus its syntax is ugly. In
: traditional UNIX system, cc (and its variants) is the gold standard norm for
: C compiler. gcc is just a GNU clone for cc on Unix.

avatar
m*l
58
clang胜在error message啥的, 是想user friendly

【在 d****n 的大作中提到】
: google现在颇有些人在为clang贡献代码。
: obj-c不太清楚,没有用过。不过从开源出来的
: clang版本而言,抛开obj-c,clang还是一个对于gcc而言极有
: 竞争力的产品。好像现在openbsd还是其他一个bsd的版本,已经
: 替换gcc为clang了。
: 有竞争对于编译器的使用者而言,是好事情:)
: gcc前段时间花大力气改进了内部的模块化,
: 我感觉clang的存在也是gcc做这个改进的驱动之一
:
: because

avatar
d*n
59
新的gcc,比如4.8.0,error message已经好很多了
clang页面上提供的对比比较老了。
clang提供相对准确的错误信息的一个主要原因是所有的
在clang的ast里,有对节点所对应的在source code
里的位置精确的描述。所以在报错的时候,能比较准确的定位。
我感觉clang还有一个好的地方就是模块化好,
新人相对容易上手(这个也可以归结为user friendly).
另外就是clang容易扩展,在clang的基础上开发针对c/c++的
程序分析,代码重构这样的工具比较方便。使用clang的内部
功能,只需要把对应的库链接进自己的工具里,然后
调用接口就可以了.

【在 m*******l 的大作中提到】
: clang胜在error message啥的, 是想user friendly
avatar
x*u
60
官网上只有一个很老的3.1,还是experimental build。。。

【在 d****n 的大作中提到】
: 现在clang好像可以在win下用,不过没有试过。。。
avatar
x*u
61
clang/llvm主要是在架构上领先各种开源闭源的对手.

【在 d****n 的大作中提到】
: google现在颇有些人在为clang贡献代码。
: obj-c不太清楚,没有用过。不过从开源出来的
: clang版本而言,抛开obj-c,clang还是一个对于gcc而言极有
: 竞争力的产品。好像现在openbsd还是其他一个bsd的版本,已经
: 替换gcc为clang了。
: 有竞争对于编译器的使用者而言,是好事情:)
: gcc前段时间花大力气改进了内部的模块化,
: 我感觉clang的存在也是gcc做这个改进的驱动之一
:
: because

avatar
d*n
62
新东西,没有太多冗余在里边。
GCC发展了这么多年,有不少东西都在一定程度上阻碍了他的发展,
比如说,GCC支持的后端比LLVM多,前端还有gfortran一样的东西,
支持的东西多了,塞进代码里的包袱也就多。。。整体改动起来也
就更难了

【在 x****u 的大作中提到】
: clang/llvm主要是在架构上领先各种开源闭源的对手.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。