由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ 11问题:emplace_back()
相关主题
请教unique_ptr vs auto_ptrTest your C++ knowledge...
大家觉得C++复杂在哪里?Re: 110道C++面试题目,你会做多少? (转载)
问个disable copy constructor的问题C++问题,confusing...
请教几个C++问题C++里面
请教个Bloomberg 的 C++ 题目C++ questions
c++ questionone question about struct
what is the difference?C++: exception: out-of-order execution?
C++ 中 myobject * a =new myobject[n] 的问题[合集] 关于C++ default copy constructor
相关话题的讨论汇总
话题: person话题: clang话题: george话题: emplace话题: c++
进入Programming版参与讨论
1 (共1页)
d******3
发帖数: 70
1
我觉得这个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()的理解有错吗?
d****i
发帖数: 4809
2
发现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");
: }

d****i
发帖数: 4809
3
还是老老实实写成这样吧,读起来不省心很多吗?
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");
: }

e*****w
发帖数: 144
4
要放入容器还是需要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");
: }

S**I
发帖数: 15689
5
不如用plain old ANSI C90。

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

d******3
发帖数: 70
6
不会compile的

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

t****t
发帖数: 6806
7
没用过就不要出来瞎嚷嚷了.

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

t****t
发帖数: 6806
8
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");
: }

d******3
发帖数: 70
9
大牛你这move的是string还是Person呀?

【在 t****t 的大作中提到】
: persons.emplace_back(std::move("George"));
t****t
发帖数: 6806
10
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呀?
相关主题
c++ questionTest your C++ knowledge...
what is the difference?Re: 110道C++面试题目,你会做多少? (转载)
C++ 中 myobject * a =new myobject[n] 的问题C++问题,confusing...
进入Programming版参与讨论
d******3
发帖数: 70
11
找到正解了。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的要求就满足了。
x****u
发帖数: 44466
12
用C++11里面的lambda语法写写异步程序,就知道这狗屁东西有多么的丑陋了。

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

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

【在 b*******s 的大作中提到】
: 有么?
b*******s
发帖数: 5216
15
不用vs

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

x****u
发帖数: 44466
16
MS算是现存最大的CPP粉丝了。

【在 b*******s 的大作中提到】
: 不用vs
d******3
发帖数: 70
17
大牛是在用Asio?

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

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

【在 d******3 的大作中提到】
: 大牛是在用Asio?
a**e
发帖数: 64
20
有一点很有意思,虽然编译的时候要求有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

相关主题
C++里面C++: exception: out-of-order execution?
C++ questions[合集] 关于C++ default copy constructor
one question about struct抠字眼:assignment and initialize in C++
进入Programming版参与讨论
t****t
发帖数: 6806
21
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;

t****t
发帖数: 6806
22
这个有问题, 我感觉是编译器的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

m*******l
发帖数: 12782
23
好像是你如果定义了删除,她就不给你默认的了?

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

t****t
发帖数: 6806
24
我再研究一下.

【在 m*******l 的大作中提到】
: 好像是你如果定义了删除,她就不给你默认的了?
s***e
发帖数: 403
25
因为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

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

【在 m*******l 的大作中提到】
: 好像是你如果定义了删除,她就不给你默认的了?
d****i
发帖数: 4809
27
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.

t****t
发帖数: 6806
28
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?

m*******l
发帖数: 12782
29
and it is an inline definition

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

d******3
发帖数: 70
30
这个有依据吗?我一直以为这是个declaration。

【在 m*******l 的大作中提到】
: and it is an inline definition
相关主题
An empty C structure Question大家觉得C++复杂在哪里?
copy constructor问题。问个disable copy constructor的问题
请教unique_ptr vs auto_ptr请教几个C++问题
进入Programming版参与讨论
d******3
发帖数: 70
31
这就回答了前面aaee的问题了。

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

m*******l
发帖数: 12782
32
C++ standard
8.4.3 Deleted definitions

【在 d******3 的大作中提到】
: 这个有依据吗?我一直以为这是个declaration。
m*******l
发帖数: 12782
33
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

d******3
发帖数: 70
34
有意思。
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.

x****u
发帖数: 44466
35
clang有原配地位的就是OSX吧,ObjC才是正选啊。

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

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

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

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

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

【在 d****n 的大作中提到】
: clang在对于c++新标准的推动和支持上做的很好
相关主题
请教几个C++问题what is the difference?
请教个Bloomberg 的 C++ 题目C++ 中 myobject * a =new myobject[n] 的问题
c++ questionTest your C++ knowledge...
进入Programming版参与讨论
d****i
发帖数: 4809
41
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++新标准的推动和支持上做的很好
d****n
发帖数: 1241
42
现在clang好像可以在win下用,不过没有试过。。。

【在 x****u 的大作中提到】
: 问题是clang只在Linux和MacOS上用的多啊,而这两个环境下C++没有Windows流行。
d****n
发帖数: 1241
43
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.

m*******l
发帖数: 12782
44
clang胜在error message啥的, 是想user friendly

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

d****n
发帖数: 1241
45
新的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
x****u
发帖数: 44466
46
官网上只有一个很老的3.1,还是experimental build。。。

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

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

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

【在 x****u 的大作中提到】
: clang/llvm主要是在架构上领先各种开源闭源的对手.
1 (共1页)
进入Programming版参与讨论
相关主题
[合集] 关于C++ default copy constructor请教个Bloomberg 的 C++ 题目
抠字眼:assignment and initialize in C++c++ question
An empty C structure Questionwhat is the difference?
copy constructor问题。C++ 中 myobject * a =new myobject[n] 的问题
请教unique_ptr vs auto_ptrTest your C++ knowledge...
大家觉得C++复杂在哪里?Re: 110道C++面试题目,你会做多少? (转载)
问个disable copy constructor的问题C++问题,confusing...
请教几个C++问题C++里面
相关话题的讨论汇总
话题: person话题: clang话题: george话题: emplace话题: c++