Nối vào câu trả lời của JaredPar
1 ctor thông thường, 2-function-like-ctor với đối tượng tạm thời.
Biên dịch nguồn này ở đâu đó tại đây http://melpon.org/wandbox/ với các trình biên dịch khác nhau
// turn off rvo for clang, gcc with '-fno-elide-constructors'
#include <stdio.h>
class Thing {
public:
Thing(const char*){puts(__FUNCTION__ );}
Thing(const Thing&){puts(__FUNCTION__ );}
~Thing(){puts(__FUNCTION__);}
};
int main(int /*argc*/, const char** /*argv*/) {
Thing myThing = Thing("asdf");
}
Và bạn sẽ thấy kết quả.
Từ ISO / IEC 14882 2003-10-15
8,5, phần 12
Công trình thứ 1, 2 của bạn được gọi là khởi tạo trực tiếp
12.1, phần 13
Một chuyển đổi loại ký hiệu chức năng (5.2.3) có thể được sử dụng để tạo các đối tượng mới của loại. [Lưu ý: Cú pháp trông giống như một cuộc gọi rõ ràng của nhà xây dựng. ] ... Một đối tượng được tạo theo cách này không được đặt tên. [Lưu ý: 12.2 mô tả thời gian tồn tại của các đối tượng tạm thời. ] [Lưu ý: các lệnh gọi hàm tạo rõ ràng không mang lại giá trị, xem 3.10. ]
Nơi để đọc về RVO:
12 Hàm thành viên đặc biệt / 12.8 Sao chép các đối tượng lớp / Phần 15
Khi các tiêu chí nhất định được đáp ứng, việc triển khai được phép bỏ qua cấu trúc sao chép của một đối tượng lớp, ngay cả khi hàm tạo sao chép và / hoặc hàm hủy cho đối tượng có tác dụng phụ .
Tắt nó với cờ trình biên dịch từ bình luận để xem hành vi sao chép như vậy)