Section 12.8.8 of the C++ standard specifies that a default generated copy constructor should call the copy constructors of its base members.
However, as can be seen by running the following code
struct B {
B() {}
template B(const T&) { cout << "In B(const T&)\n"; }
B(const B&) { cout << "In copy constructor\n"; }
};
struct D : B {
D() {}
};
int main() {
D d1;
D d2(d1);
}
the default copy constructor of D calls the template constructor of B instead of B's copy constructor. It appears that root of the problem is that the compiler is generating this:
D::D(const D &rhs) : B(rhs) {}
which will perform. overload resolution and pick the template constructor. Instead, the compiler needs to generate something like this:
D::D(const D &rhs) : B(static_cast(rhs)) {}
Writing the above code is also the explicit workaround for this bug.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24104518/viewspace-721685/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24104518/viewspace-721685/