n******m 发帖数: 169 | |
E***n 发帖数: 166 | 2 我编译了你的code 2
结果:
error: no matching function for call to 'A::A(A)'
我估计是因为你用的参数是1, 1是const
【在 n******m 的大作中提到】 : Code 1
|
h**k 发帖数: 3368 | 3 如果去掉A(A&){cout<<"copy con";},应该能编译成功。
【在 n******m 的大作中提到】 : Code 1
|
n******m 发帖数: 169 | 4 是的,问题就是const, 问题就是那个 A(A&)...
Code3, 把A(A&) 换成 A(const A&) 了,结果呢,通过了,但是运行的结果表明 A(
const A&) 没有被调用过,只调用了 A(int). 我的问题就是既然这段函数不被 a=1 调
用,那么为什么会报错了?注意到Code1里,在没有 a=1 的时候是没有报错的。
其实把 a=1 改成 a(1) 也能顺利运行。
感觉 a=1 对copy constructor 做了些什么,但是却没有调用它。。。十分不解。而且
报出来的错相当看不明白。 |
y**i 发帖数: 1112 | 5 主要的问题在于编译器认为a=1的语句会去调用哪一个函数,一般a=1实际上是要去隐式
调用构造函数,除非你声明你的第一个构造函数A(int)为explicit。这里似乎如果你声
明copy构造的参数为非const的时候,造成了声明的歧义,A a=1的语句试图去匹配这个
构造函数,变成了类似A temp(1), a(temp);但声明为const就不会造成这种歧义,让a=
1直接去寻找A(int)的signiture
【在 n******m 的大作中提到】 : 是的,问题就是const, 问题就是那个 A(A&)... : Code3, 把A(A&) 换成 A(const A&) 了,结果呢,通过了,但是运行的结果表明 A( : const A&) 没有被调用过,只调用了 A(int). 我的问题就是既然这段函数不被 a=1 调 : 用,那么为什么会报错了?注意到Code1里,在没有 a=1 的时候是没有报错的。 : 其实把 a=1 改成 a(1) 也能顺利运行。 : 感觉 a=1 对copy constructor 做了些什么,但是却没有调用它。。。十分不解。而且 : 报出来的错相当看不明白。
|
n******m 发帖数: 169 | 6 恩,你说得跟实际结果完全一样。
但是我还是不解,如果我是编译器,我看到 a=1 ,我就直接找 A(int),找到了就好了
。那就不会报错。
如果我是比较笨的编译器,我看到 a=1 非得转化成 A temp(1) a(temp).那么我会给
code2报错,但是运行code3 的时候,我会作 A temp(1) a(temp) 分别调用了了 A(int
), A(const A&)....
声明 explicit,肯定报错吧?
为什么编译器会试图去匹配 A(A&),但是不试图去匹配 A(const A&)?不懂他的心思阿
,能详细说说么?
a=
【在 y**i 的大作中提到】 : 主要的问题在于编译器认为a=1的语句会去调用哪一个函数,一般a=1实际上是要去隐式 : 调用构造函数,除非你声明你的第一个构造函数A(int)为explicit。这里似乎如果你声 : 明copy构造的参数为非const的时候,造成了声明的歧义,A a=1的语句试图去匹配这个 : 构造函数,变成了类似A temp(1), a(temp);但声明为const就不会造成这种歧义,让a= : 1直接去寻找A(int)的signiture
|