Xin lỗi vì tiêu đề quá mơ hồ (do thiếu kỹ năng tiếng Anh của tôi). Vui lòng đề xuất một tiêu đề tốt hơn.Tại sao trình tạo bản sao không được gọi?
Vui lòng xem xét mã sau đây.
struct A {
typedef std::vector<double> State;
// template <class... Args>
// A(Args... args)
// : a(args...)
// {}
template <class... Args>
A(Args&&... args)
: a(std::forward<Args>(args)...)
{}
A(const A&) = default;
A(A&&) = default;
State a;
};
int main(){
A a(3,2);
A b = a; // This line triggers an error!!
}
Gcc 4.8.0 thất bại trong việc biên dịch nó với các thông báo lỗi error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)
.
Tôi không thể hiểu tại sao mã này sai. Theo tôi, trình biên dịch nên gọi hàm tạo bản sao trong dòng A b = a;
.
Tuy nhiên, nếu tôi thay thế hàm tạo bằng trình nhận xét (chỉ đơn giản là lấy giá trị). Nó biên dịch. Hơn nữa, bây giờ các dòng cho các nhà xây dựng sao chép (và di chuyển) mặc định là không cần thiết. Điều gì xảy ra ở đây?
Ồ, tôi hiểu rồi. Cảm ơn lời giải thích rõ ràng. :) – Sungmin