Đoạn mã sau chỉ hoạt động khi có sẵn hàm tạo bản sao.Sao chép Constructor Cần thiết với đối tượng tạm thời
Khi tôi thêm báo cáo in (qua std::cout
) và làm cho trình tạo bản sao có sẵn thì không được sử dụng (tôi cho rằng có quá trình biên dịch xảy ra để xóa bản sao không cần thiết).
Nhưng ở cả đầu ra operator <<
và hàm plop()
bên dưới (nơi tôi tạo đối tượng tạm thời), tôi không thấy sự cần thiết của hàm tạo bản sao. Ai đó có thể giải thích lý do tại sao ngôn ngữ cần nó khi tôi đi qua tất cả mọi thứ bằng tham chiếu const (hoặc những gì tôi đang làm sai).
#include <iostream>
class N
{
public:
N(int) {}
private:
N(N const&);
};
std::ostream& operator<<(std::ostream& str,N const& data)
{
return str << "N\n";
}
void plop(std::ostream& str,N const& data)
{
str << "N\n";
}
int main()
{
std::cout << N(1); // Needs copy constructor (line 25)
plop(std::cout,N(1)); // Needs copy constructor
N a(5);
std::cout << a;
plop(std::cout,a);
}
Compiler:
[Alpha:~/X] myork% g++ -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5646~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5646)[Alpha:~/X] myork% g++ t.cpp
t.cpp: In function ‘int main()’:
t.cpp:10: error: ‘N::N(const N&)’ is private
t.cpp:25: error: within this context
t.cpp:10: error: ‘N::N(const N&)’ is private
t.cpp:26: error: within this context
Đây là một phiên bản đơn giản của một số mã thực.
Trong mã thực, tôi có một lớp có chứa tiêu chuẩn :: auto_ptr. Điều này có nghĩa rằng một constructor sao chép mà phải mất một tham chiếu const là không hợp lệ (không có một số công việc) và tôi đã nhận được một lỗi chỉ ra rằng các nhà xây dựng bản sao đã không có sẵn vì nó:
Thay đổi lớp quá:
class N
{
public:
N(int) {}
private:
std::auto_ptr<int> data;
};
lỗi này là sau đó:
t.cpp:25: error: no matching function for call to ‘N::N(N)’
trình biên dịch nào? Điều này biên dịch tốt trên VC9 – Naveen
N (N const &) phải là N (const N &) –
@Captain: Không thực sự. Cả hai đều hợp lệ. Tôi thích hình thức tôi sử dụng ở trên. –