n******m 发帖数: 169 | |
u****u 发帖数: 229 | |
n******m 发帖数: 169 | 3 你的文章没有解决我的问题哦。。。
我的问题实际上是 a=1 这句话干了些什么:是(1)还是(2)呢?
(1)调用了 A(1), 生成a.
(2)调用了A(1), 生成了一个temporary object, 然后 “=”调用了copy constructor,
把temporary object 复制给a.
如果是(1),那么code2 应该不报错。实际上如果把 a=1 改成 a(1) 就能够顺利编译。
如果是(2),code2 应该报错,因为 A(A&) 屏蔽了系统自动给的copy constructor,
但是它的参数没法匹配 temporary object, 因为temp 都是 const 的。所以 code3 里
改成了 A(const A&). 但是输出结果显示copy constructor 根本没有被调用过。所以
不解。
感觉上compiler应该是能优化的,所以他的行为比较可能是(1),但是这样应该不报
错,所以不解阿 |
e****d 发帖数: 895 | 4 I think (2) is the case and the copy constructor is not called because
of compiler optimzation.
constructor,
译。
,
【在 n******m 的大作中提到】 : 你的文章没有解决我的问题哦。。。 : 我的问题实际上是 a=1 这句话干了些什么:是(1)还是(2)呢? : (1)调用了 A(1), 生成a. : (2)调用了A(1), 生成了一个temporary object, 然后 “=”调用了copy constructor, : 把temporary object 复制给a. : 如果是(1),那么code2 应该不报错。实际上如果把 a=1 改成 a(1) 就能够顺利编译。 : 如果是(2),code2 应该报错,因为 A(A&) 屏蔽了系统自动给的copy constructor, : 但是它的参数没法匹配 temporary object, 因为temp 都是 const 的。所以 code3 里 : 改成了 A(const A&). 但是输出结果显示copy constructor 根本没有被调用过。所以 : 不解。
|
n******m 发帖数: 169 | 5 you mean (1) ba?
In (1) I mean compiler optimized in calling A(int) for 'a', without invoking
the copy constructor, even '=' presents.
In (2), I mean compiler does call copy constructor.
【在 e****d 的大作中提到】 : I think (2) is the case and the copy constructor is not called because : of compiler optimzation. : : constructor, : 译。 : ,
|
n******m 发帖数: 169 | 6 而且我还有个问题,一般在声明的时候用=,就有迹象表明用户想调用copy
constructor, 但是如果compiler这样自己优化了,不调用,那岂不是会搞出一些很难
查出的错?(例如用户定义的copy constructor比较特别的时候) |
d****p 发帖数: 685 | 7 A a=1 doesn't invoke copy ctor; you can rewrite it as A a(1). So it is a
good practice to avoid the = form when initializing an object.
The compiler error is the missing const in your copy ctor declaration.
【在 n******m 的大作中提到】 : 而且我还有个问题,一般在声明的时候用=,就有迹象表明用户想调用copy : constructor, 但是如果compiler这样自己优化了,不调用,那岂不是会搞出一些很难 : 查出的错?(例如用户定义的copy constructor比较特别的时候)
|
d****p 发帖数: 685 | 8 A a = 1
does the following things:
claim memory on stack in sizeof(A)
pass the address of the claimed memory to the first hidden parameter of A(
int) for invocation.
Execute A(int)
now a is initialized. There is no optimization involved.
constructor,
译。
,
【在 n******m 的大作中提到】 : 你的文章没有解决我的问题哦。。。 : 我的问题实际上是 a=1 这句话干了些什么:是(1)还是(2)呢? : (1)调用了 A(1), 生成a. : (2)调用了A(1), 生成了一个temporary object, 然后 “=”调用了copy constructor, : 把temporary object 复制给a. : 如果是(1),那么code2 应该不报错。实际上如果把 a=1 改成 a(1) 就能够顺利编译。 : 如果是(2),code2 应该报错,因为 A(A&) 屏蔽了系统自动给的copy constructor, : 但是它的参数没法匹配 temporary object, 因为temp 都是 const 的。所以 code3 里 : 改成了 A(const A&). 但是输出结果显示copy constructor 根本没有被调用过。所以 : 不解。
|
t****t 发帖数: 6806 | 9 eworld is right. see 8.5, clause 12~14
【在 d****p 的大作中提到】 : A a=1 doesn't invoke copy ctor; you can rewrite it as A a(1). So it is a : good practice to avoid the = form when initializing an object. : The compiler error is the missing const in your copy ctor declaration.
|
d****p 发帖数: 685 | 10 Thats no point: A a(1) semantically identical to A a = 1. And the standard
has already indicated it may trigger move semantics.
Even the simplest compiler will do that without optimization turned on.
【在 t****t 的大作中提到】 : eworld is right. see 8.5, clause 12~14
|
|
|
p***o 发帖数: 1252 | 11
They are different. The second one requires the ctor to be non-explicit.
【在 d****p 的大作中提到】 : Thats no point: A a(1) semantically identical to A a = 1. And the standard : has already indicated it may trigger move semantics. : Even the simplest compiler will do that without optimization turned on.
|
n******m 发帖数: 169 | 12 en....
at this point I believe 'A a=1' does one more thing than 'A a(1)', that is
it check for sure the existence of a correct copy constructor. otherwise,
code2 will not report error.
【在 d****p 的大作中提到】 : A a = 1 : does the following things: : claim memory on stack in sizeof(A) : pass the address of the claimed memory to the first hidden parameter of A( : int) for invocation. : Execute A(int) : now a is initialized. There is no optimization involved. : : constructor, : 译。
|
p***o 发帖数: 1252 | 13
You are not supposed to have those special things in a copy ctor ...
【在 n******m 的大作中提到】 : 而且我还有个问题,一般在声明的时候用=,就有迹象表明用户想调用copy : constructor, 但是如果compiler这样自己优化了,不调用,那岂不是会搞出一些很难 : 查出的错?(例如用户定义的copy constructor比较特别的时候)
|
d****p 发帖数: 685 | 14 Hmmm. That's right.
So A a = 1 is
..A tmpA(1);
..A a = tmpA;
But optimization comes in.
Sorry for my previous post that is misleading.
【在 n******m 的大作中提到】 : en.... : at this point I believe 'A a=1' does one more thing than 'A a(1)', that is : it check for sure the existence of a correct copy constructor. otherwise, : code2 will not report error.
|
o*******0 发帖数: 699 | 15 那就是说
A a = 1; 和 A a(1); 在这里是等同的了?
我在VS2010 上试, copy constructor without const 没问题啊?
【在 d****p 的大作中提到】 : Hmmm. That's right. : So A a = 1 is : ..A tmpA(1); : ..A a = tmpA; : But optimization comes in. : Sorry for my previous post that is misleading.
|
p***o 发帖数: 1252 | 16 VC allows to bind temporary objects to non-const references,
which is not allowed by the standard. You need to use gcc for
this example.
【在 o*******0 的大作中提到】 : 那就是说 : A a = 1; 和 A a(1); 在这里是等同的了? : 我在VS2010 上试, copy constructor without const 没问题啊?
|
t****t 发帖数: 6806 | 17 A a=1 is roughly equivalent to A a=A(1). however the first expression
requires the constructor A::A(int) to be non-explicit.
never mind how VS thinks your c++ program.
【在 o*******0 的大作中提到】 : 那就是说 : A a = 1; 和 A a(1); 在这里是等同的了? : 我在VS2010 上试, copy constructor without const 没问题啊?
|