关于this帖å,请解释一下这ç§è¡Œä¸ºï¼š
#include <stdio.h>
struct B { B(B&) { } B() { } };
struct A {
template<typename T>
A(T&){ printf("A(T&)\n"); }
A() { }
// B b; // when this is uncommented, output changes
int i;
};
int main() {
A a;
A b(a);
// B b; commented:
// template wins:
// A<A>(A&) -- specialization
// A(A const&); -- implicit copy constructor
// (prefer less qualification)
// B b; uncommented:
// implicit copy constructor wins:
// A<A>(A&) -- specialization
// A(A&); -- implicit copy constructor
// (prefer non-template)
printf("\nA\n");
A const a1;
A b1(a1);
// B b; commented:
// implicit copy constructor wins:
// A(A const&) -- specialization
// A(A const&) -- implicit copy constructor
// (prefer non-template)
// B b; uncommented:
// template wins:
// A(A const&) -- specialization
// (implicit copy constructor not viable)
}
B b时输出å˜åŒ–;没有注释。
显然,当A(A const&)
å–消注释时,éšå¼å¤åˆ¶æž„é€ å‡½æ•°ä¼šä»ŽA(A &)
更改为B b;
。为什么?当我将B(B&){}
更改为B(const B&){}
时,å¤åˆ¶æž„é€ å‡½æ•°ä¼šæ›´æ”¹å›žA(A const&)
。现在编译器满æ„A()
çš„å½¢å¼å‚数将是const
ï¼Ÿè¿™ä¸Žæ ‡å‡†æœ‰ä»€ä¹ˆå…³ç³»å—? (我æ£åœ¨ä½¿ç”¨gcc 4.2.4。)
ç”案 0 :(得分:4)
ç±»A
çš„éšå¼å¤åˆ¶æž„é€ å‡½æ•°çš„ç¾å仅为A(const A&)
,如果å¯è¡Œã€‚å–消注释B b;
行时,æ¤å¤åˆ¶æž„é€ å‡½æ•°ä¸å¯è¡Œï¼Œå› 为B
çš„å¤åˆ¶æž„é€ å‡½æ•°éœ€è¦éžconst输入å‚数。
// Illegal implicit copy constructor
A::A(const A& a) :
b(a.b), // This line would be illegal because a.b is const
i(a.i)
{
}
在这ç§æƒ…况下,éšå¼å¤åˆ¶æž„é€ å‡½æ•°ä¹Ÿæ˜¯éžconst版本:A(A&);
。
// Legal implicit copy constructor
A::A(A& a) :
b(a.b), // Fine: a.b is now non-const
i(a.i)
{
}
这就是在类定义ä¸å–消注释B b;
更改éšå¼å¤åˆ¶æž„é€ å‡½æ•°å¹¶å› æ¤æ›´æ”¹ç¨‹åºè¡Œä¸ºçš„åŽŸå› ã€‚
编辑:没有直接相关,但为了完整起è§ï¼šå¦‚æžœB
没有å¯è®¿é—®çš„å¤åˆ¶æž„é€ å‡½æ•°ï¼ˆå› ä¸ºå®ƒè¢«å£°æ˜Žä¸ºprivate
æˆ–å·²åˆ é™¤ï¼‰ï¼ŒA
将没有éšå¼å‰¯æœ¬æž„é€
ç”案 1 :(得分:3)
æ˜¯çš„ï¼Œè¿™ä¸ªè¡Œä¸ºæ˜¯ç”±æ ‡å‡†å®šä¹‰çš„ï¼Œåœ¨12.8 / 8:
 Âç±»
X
çš„éšå¼å£°æ˜Žçš„å¤åˆ¶æž„é€ å‡½æ•°å°†å…·æœ‰X::X(const X &)
å½¢å¼ï¼Œå¦‚æžœ[...æ¡ä»¶æœ‰æ„义......],å¦åˆ™[它]将具有X::X(X &)
å½¢å¼{ {1}}。
å®žé™…ä¸Šï¼Œå¦‚æžœä½ çš„ç±»A
有一个æˆå‘˜B
,则const表å•æ˜¯ä¸å¯èƒ½çš„ï¼Œå› æ¤éšå¼å£°æ˜Žçš„å¤åˆ¶æž„é€ å‡½æ•°é‡‡ç”¨éžconstå½¢å¼ã€‚
请注æ„,模æ¿åŒ–æž„é€ å‡½æ•°æ°¸è¿œä¸æ˜¯ copy æž„é€ å‡½æ•°ã€‚