Tôi có đơn giản C++ mã sau:"tên các nhà xây dựng, không phải là loại" trong G ++ 4.4.7
#include <cstdio>
class A
{
public:
A(int y) : x(y) {}
A& operator=(const A& rhs);
int x;
};
A::A& A::operator=(const A& rhs) { this->x = rhs.x; return *this; }
int main(int, char**)
{
A a1(5);
A a2(4);
printf("a2.x == %d\n", a2.x);
a2 = a1;
printf("a2.x == %d\n", a2.x);
return 0;
}
Dòng 11, nơi mà các định nghĩa của operator=()
chức năng A
's là lúc, bị thay đổi. ..hoặc, ít nhất, tôi tin như vậy. Đúng như dự đoán, G ++ 4.7.4, cũng như tất cả các phiên bản mới hơn của GCC mà tôi đã cố gắng, ném các lỗi sau:
main.cpp:11:1: error: ‘A::A’ names the constructor, not the type
Nhưng kỳ lạ, tuy nhiên, G ++ 4.4.7 biên dịch chương trình này thành công, không có cảnh báo và thậm chí in 4 và 5 như mong đợi nếu dòng 11 được viết chính xác (nghĩa là chỉ với A&
thay vì A::A&
).
Ai đó có thể giúp tôi giải mã chính xác những gì đang xảy ra ở đó với G ++ 4.4.7 không? Đây có phải chỉ là một lỗi trong bản phát hành đó (mặc dù là một bản phát hành cực kỳ cũ, và xấu hổ với chúng tôi vì vẫn còn sử dụng nó)? Tôi nghĩ rằng tiêu chuẩn sẽ nêu rõ cách chức năng operator=()
phải được khai báo và xác định.
Không có sự xấu hổ trong việc sử dụng một trình biên dịch cũ để hỗ trợ một codebase di sản. Thật khó để có được tài trợ để nâng cấp chuỗi công cụ cho một sản phẩm đang hoạt động. – user4581301