Xét đoạn mã sau:Sao chép constructor không gọi khi khởi tạo một đối tượng với giá trị trả về của một hàm
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a = b.a;
cout << "Copy Constructor\n";
}
A fun(A a)
{
return a;
}
};
int main()
{
A a, c;
A b = a.fun(c);
return 0;
}
Kết quả của đoạn mã trên với g++ file.cpp
là:
Constructor
Constructor
Copy Constructor
Copy Constructor
Đầu ra của trên mã với g++ -fno-elide-constructors file.cpp
là:
Constructor
Constructor
Copy Constructor
Copy Constructor
Copy Constructor
tôi biết Return Value optimization ation. Câu hỏi của tôi là gọi để sao chép constructor được elided (đối tượng tạm thời trong khi trở về hoặc trả lại đối tượng được sao chép vào b)?
Nếu hàm tạo bản sao ưu tiên là hàm tạo được sử dụng để tạo b, thì b được tạo ra như thế nào (vì không có lệnh gọi hàm tạo nào trong trường hợp này)?
Nếu tôi thay thế dòng A b = a.fun(c);
với a.fun(c)
và biên dịch bằng cách sử dụng phương pháp đầu tiên hoặc thậm chí các phương pháp thứ hai, sau đó cũng constructor sao chép đang được gọi là 2 lần. Vì vậy, nếu trong trường hợp được giải thích trong đoạn trước, thì hàm tạo bản sao của đối tượng tạm thời được elided, thì tại sao nó không được elided trong trường hợp này?
Làm thế nào tôi kiểm tra công cụ này khi tôi đã học về nó tất cả là 'std :: cout <<" Sao chép constructor: "<< (void *) b <<" to "<< (void *) << std :: endl;' và 'std :: cout <<" Xây dựng "<< (void *) << std :: endl' này. Điểm thưởng nếu bạn thêm di chuyển vào C++ 11. – IdeaHat