Dưới đây là một ví dụ mã tối thiểu mà minh họa các vấn đề:Tại sao cảnh báo này từ trình biên dịch C/C++ XL của IBM?
#include <iostream>
class Thing
{
// Non-copyable
Thing(const Thing&);
Thing& operator=(const Thing&);
int n_;
public:
Thing(int n) : n_(n) {}
int getValue() const { return n_;}
};
void show(const Thing& t)
{
std::cout << t.getValue() << std::endl;
}
int main()
{
show(3);
}
Điều này mang lại những lỗi tương tự:
int main()
{
show(Thing(3));
}
IBM XL C/C++ 8.0 biên dịch dưới AIX phát ra những cảnh báo này:
"testWarning.cpp", line 24.9: 1540-0306 (W) The "private" copy constructor "Thing(const Thing &)" cannot be accessed.
"testWarning.cpp", line 24.9: 1540-0308 (I) The semantics specify that a temporary object must be constructed.
"testWarning.cpp", line 24.9: 1540-0309 (I) The temporary is not constructed, but the copy constructor must be accessible.
Tôi cũng đã thử g ++ 4.1.2 với "-Wall" và "-pedantic" và không có chẩn đoán. Tại sao truy cập vào hàm tạo bản sao được yêu cầu ở đây? Làm thế nào tôi có thể loại bỏ cảnh báo, ngoài việc làm cho đối tượng có thể sao chép (nằm ngoài tầm kiểm soát của tôi) hoặc tạo một bản sao rõ ràng để chuyển (khi đối tượng thực tế đắt tiền sao chép)?
Bạn có thực sự đang sử dụng trình tạo bản sao đó trong quá trình triển khai lớp ở đâu đó không? –
No. Tôi đã đăng toàn bộ tệp mã đã tạo ra chẩn đoán. –
FYI: Tôi cũng đã thử với VC++ 2005 & 2008, biên soạn không có cảnh báo. Vì vậy, có vẻ như bạn là đúng, vấn đề dường như là IBM biên tập cụ thể – jdehaan