class A
{
public:
A(const int n_);
A(const A& that_);
A& operator=(const A& that_);
};
A::A(const int n_)
{ cout << "A::A(int), n_=" << n_ << endl; }
A::A(const A& that_) // This is line 21
{ cout << "A::A(const A&)" << endl; }
A& A::operator=(const A& that_)
{ cout << "A::operator=(const A&)" << endl; }
int foo(const A& a_)
{ return 20; }
int main()
{
A a(foo(A(10))); // This is line 38
return 0;
}
Thực thi mã này cho o/p:Tại sao ctor sao chép được sử dụng trong mã này?
A::A(int), n_=10
A::A(int), n_=20
Rõ ràng các nhà xây dựng bản sao không bao giờ được gọi.
class A
{
public:
A(const int n_);
A& operator=(const A& that_);
private:
A(const A& that_);
};
Tuy nhiên, nếu chúng ta làm cho nó tin, biên dịch lỗi này xảy ra:
Test.cpp: In function ‘int main()’:
Test.cpp:21: error: ‘A::A(const A&)’ is private
Test.cpp:38: error: within this context
Tại sao biên dịch phàn nàn khi nó không thực sự sử dụng constructor sao chép?
Tôi đang sử dụng phiên bản gcc 4.1.2 20070925 (Mũ Đỏ 4.1.2-33)
FYI Tôi nghĩ rằng điều này vẫn còn hiện diện trong C++ 11 ('12.2/1'). –