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呀?
|
|
|
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
|
|
|
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
|
|
|
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++新标准的推动和支持上做的很好
|
|
|
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主要是在架构上领先各种开源闭源的对手.
|