Dưới đây là đoạn mã nhỏ:Tại sao copy constructor không được gọi trong trường hợp này?
class A
{
public:
A(int value) : value_(value)
{
cout <<"Regular constructor" <<endl;
}
A(const A& other) : value_(other.value_)
{
cout <<"Copy constructor" <<endl;
}
private:
int value_;
};
int main()
{
A a = A(5);
}
tôi cho rằng đầu ra sẽ là "Regular Constructor" (ví RHS) tiếp theo là "Copy constructor" cho LHS. Vì vậy, tôi tránh phong cách này và luôn luôn tuyên bố biến của lớp là A a(5);
. Nhưng với sự ngạc nhiên của tôi trong đoạn mã trên, hàm dựng không bao giờ được gọi (Visual C++ 2008)
Không ai biết hành vi này là kết quả của tối ưu hóa trình biên dịch hay một số tính năng (và di động) được ghi chép của C++? Cảm ơn.
nó được tối ưu hóa, tránh tạo + sao chép. Tôi thấy rằng đó là một giả định tốt rằng không có người dùng nào sẽ xây dựng từ các tham số, khác với những gì nó được thực hiện sao chép-xây dựng – jpinto3912
Xem thêm: http: // stackoverflow.com/questions/1394229/compreh-return-value-optimization-và-return-temporaries-c –
Trong g ++, bạn có thể vô hiệu hóa tối ưu hóa này với tùy chọn -fide-elide-constructors – Fred