关于这篇文章,请解释这种行为:
#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。)